{"openapi":"3.0.3","info":{"title":"3Common API","description":"Public REST API for the 3Common event management platform.","version":"0.0.1","contact":{"name":"3Common Support","url":"https://help.3common.com"}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key as Bearer token"}},"schemas":{"TextBulletListInput":{"type":"object","properties":{"type":{"type":"string","enum":["bulletList"]},"content":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/TextListItemInput"}}},"required":["type","content"],"additionalProperties":false},"TextOrderedListInput":{"type":"object","properties":{"type":{"type":"string","enum":["orderedList"]},"attrs":{"type":"object","properties":{"start":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991}},"additionalProperties":false},"content":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/TextListItemInput"}}},"required":["type","content"],"additionalProperties":false},"TextListItemInput":{"type":"object","properties":{"type":{"type":"string","enum":["listItem"]},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false}]},"minItems":1,"maxItems":1}},"required":["type","content"],"additionalProperties":false},"TextBulletList":{"type":"object","properties":{"type":{"type":"string","enum":["bulletList"]},"content":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/TextListItem"}}},"required":["type","content"],"additionalProperties":false},"TextOrderedList":{"type":"object","properties":{"type":{"type":"string","enum":["orderedList"]},"attrs":{"type":"object","properties":{"start":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["start"],"additionalProperties":false},"content":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/TextListItem"}}},"required":["type","content"],"additionalProperties":false},"TextListItem":{"type":"object","properties":{"type":{"type":"string","enum":["listItem"]},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false}]},"minItems":1,"maxItems":1}},"required":["type","content"],"additionalProperties":false}}},"paths":{"/health/":{"get":{"summary":"Health check","tags":["System"],"description":"Returns the server status, API version, and database connection state. No authentication required.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded"]},"version":{"type":"string"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"db":{"type":"string","enum":["connected","disconnected"]}},"required":["status","version","timestamp","db"],"additionalProperties":false}}}}}}},"/v1/":{"get":{"summary":"API info","tags":["System"],"description":"Returns basic information about the API. Requires a valid API key.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"api":{"type":"string"},"version":{"type":"string"},"docs":{"type":"string","description":"URL to the interactive API documentation"}},"required":["api","version","docs"],"additionalProperties":false}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false,"description":"Missing or invalid API key"}}}}}}},"/v1/assets/images/":{"get":{"summary":"List Image Assets","tags":["Image Assets"],"description":"Fetch a paginated list of the host's registered image assets, most recently\nregistered first. Each entry is a complete asset record, so a listed image\ncan be referenced by its `id` when composing content with no further\nlookup needed. Use this to discover existing images to reuse instead of\nuploading new ones.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":50,"type":"integer","minimum":1,"maximum":250},"in":"query","name":"pageSize","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"hasMore":{"type":"boolean","description":"If true, there are more pages of results available."},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"The host that owns this asset."},"url":{"type":"string","description":"Public download URL used by renderers to display the image. Distinct from\nstoragePath: this is the URL a client fetches."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Intrinsic pixel width of the stored derivative.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Intrinsic pixel height of the stored derivative.","minimum":0},"contentType":{"type":"string","enum":["image/jpeg","image/png"],"description":"MIME type of the stored derivative."},"sizeBytes":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Size of the stored derivative in bytes."},"filename":{"type":"string","description":"Original filename, displayed in the UI when selecting an existing image to reuse."},"purpose":{"type":"string","enum":["content"],"description":"The intended use case for the asset. Used as a hint for which images to\nsurface in different UIs.\n- 'content': for use in user-generated email and website content."},"createdAt":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"When the asset was registered, in epoch milliseconds."},"lastPublishedAt":{"description":"When the asset was most recently published to external consumers who rely on\nits public URL to render the image (e.g. sent in an email). The value is\nstored in epoch milliseconds, or null if it has never been published.\nUsers should be warned before deleting an asset with this field set, and the\nvalue should be presented to them. The user can then decide if the date is\nold enough that it's acceptable for image rendering to break for consumers.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true}},"required":["id","hostId","url","width","height","contentType","sizeBytes","filename","purpose","createdAt","lastPublishedAt"],"additionalProperties":false}}},"required":["hasMore","data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/assets/images/{id}":{"get":{"summary":"Get Image Asset","tags":["Image Assets"],"description":"Fetch a single registered image asset by its ID.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"The ID of the image asset."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"The host that owns this asset."},"url":{"type":"string","description":"Public download URL used by renderers to display the image. Distinct from\nstoragePath: this is the URL a client fetches."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Intrinsic pixel width of the stored derivative.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Intrinsic pixel height of the stored derivative.","minimum":0},"contentType":{"type":"string","enum":["image/jpeg","image/png"],"description":"MIME type of the stored derivative."},"sizeBytes":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Size of the stored derivative in bytes."},"filename":{"type":"string","description":"Original filename, displayed in the UI when selecting an existing image to reuse."},"purpose":{"type":"string","enum":["content"],"description":"The intended use case for the asset. Used as a hint for which images to\nsurface in different UIs.\n- 'content': for use in user-generated email and website content."},"createdAt":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"When the asset was registered, in epoch milliseconds."},"lastPublishedAt":{"description":"When the asset was most recently published to external consumers who rely on\nits public URL to render the image (e.g. sent in an email). The value is\nstored in epoch milliseconds, or null if it has never been published.\nUsers should be warned before deleting an asset with this field set, and the\nvalue should be presented to them. The user can then decide if the date is\nold enough that it's acceptable for image rendering to break for consumers.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true}},"required":["id","hostId","url","width","height","contentType","sizeBytes","filename","purpose","createdAt","lastPublishedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/checkouts/":{"get":{"summary":"List Checkouts","tags":["Checkouts"],"description":"Workspace-scoped paginated list of standalone checkouts. Supports\nsearch over name and description, status / event / timeslot\nfilters, and sorting incl. the computed product count and the\nowning event or form (by display name).","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false},{"schema":{"default":50,"type":"integer","minimum":1,"maximum":200},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false},{"schema":{"type":"string","enum":["open","closed"]},"in":"query","name":"status","required":false},{"schema":{"type":"string"},"in":"query","name":"eventId","required":false},{"schema":{"type":"string"},"in":"query","name":"timeslotId","required":false},{"schema":{"type":"string","enum":["name","description","createdAt","updatedAt","status","visibility","productsCount","_id","event","form"]},"in":"query","name":"sortField","required":false},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false},{"schema":{"type":"string"},"in":"query","name":"filters","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["open","closed"]},"visibility":{"type":"string","enum":["private","public"]},"products":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"visibility":{"default":"visible","type":"string","enum":["visible","conditional","hidden"]},"dependents":{"default":[],"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"minPerOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxPerOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"priceMode":{"type":"string","enum":["free","paid","pwyc"]},"price":{"type":"number"},"pwycMin":{"type":"number"},"customFees":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"rate":{"type":"number"},"isCustomFee":{"type":"boolean"},"isFixedValue":{"type":"boolean"},"includeInServiceFee":{"type":"boolean"},"defaultServiceFee":{"type":"boolean"},"isOrgDefault":{"type":"boolean"}},"required":["name","rate"],"additionalProperties":false}},"includeOrgTaxes":{"type":"boolean"}},"required":["productId"],"additionalProperties":false}}},"required":["productId","visibility","dependents"],"additionalProperties":false}},"maxTicketsPerSet":{"type":"number"},"maxTicketsPerOrder":{"type":"number"},"eventId":{"type":"string"},"timeslotId":{"type":"string"},"orderFormId":{"type":"string"},"redirectUrl":{"type":"string"},"payByInvoice":{"type":"object","properties":{"enabled":{"type":"boolean"},"memo":{"type":"string"},"taxIds":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"dueInDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["enabled"],"additionalProperties":false},"paymentMethods":{"type":"array","items":{"type":"string","enum":["card","pay_by_invoice","pay_later"]}},"payButtonLabel":{"type":"string"},"disableConfirmationEmail":{"type":"boolean"},"availableFrom":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"availableTo":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"availabilityTimezone":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"productsCount":{"type":"number"},"eventName":{"type":"string"},"eventImage":{"type":"string"},"isEventSet":{"type":"boolean"},"formName":{"type":"string"}},"required":["id","ownerId","name","status","visibility","products","createdAt","updatedAt","productsCount","isEventSet"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"pageNumber":{"type":"number"},"pageSize":{"type":"number"}},"required":["data","hasMore","pageNumber","pageSize"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/checkouts/{id}":{"get":{"summary":"Get Checkout","tags":["Checkouts"],"description":"Fetch a checkout by id. 404 if absent, deleted, or owned by another workspace.","parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Checkout id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"checkout":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["open","closed"]},"visibility":{"type":"string","enum":["private","public"]},"products":{"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"visibility":{"default":"visible","type":"string","enum":["visible","conditional","hidden"]},"dependents":{"default":[],"type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"minPerOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"maxPerOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"priceMode":{"type":"string","enum":["free","paid","pwyc"]},"price":{"type":"number"},"pwycMin":{"type":"number"},"customFees":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"rate":{"type":"number"},"isCustomFee":{"type":"boolean"},"isFixedValue":{"type":"boolean"},"includeInServiceFee":{"type":"boolean"},"defaultServiceFee":{"type":"boolean"},"isOrgDefault":{"type":"boolean"}},"required":["name","rate"],"additionalProperties":false}},"includeOrgTaxes":{"type":"boolean"}},"required":["productId"],"additionalProperties":false}}},"required":["productId","visibility","dependents"],"additionalProperties":false}},"maxTicketsPerSet":{"type":"number"},"maxTicketsPerOrder":{"type":"number"},"eventId":{"type":"string"},"timeslotId":{"type":"string"},"orderFormId":{"type":"string"},"redirectUrl":{"type":"string"},"payByInvoice":{"type":"object","properties":{"enabled":{"type":"boolean"},"memo":{"type":"string"},"taxIds":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"dueInDays":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["enabled"],"additionalProperties":false},"paymentMethods":{"type":"array","items":{"type":"string","enum":["card","pay_by_invoice","pay_later"]}},"payButtonLabel":{"type":"string"},"disableConfirmationEmail":{"type":"boolean"},"availableFrom":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"availableTo":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"availabilityTimezone":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","ownerId","name","status","visibility","products","createdAt","updatedAt"],"additionalProperties":false}},"required":["checkout"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/":{"get":{"summary":"List Contacts","tags":["Contacts"],"description":"Lists the host's contacts, sorted and filtered. Paginated.\nUse this to inspect specific rows. For \"most common\", \"top values\", or\ndistribution questions, prefer `summarize_contact_field_values` so the\nmodel does not fetch hundreds of contacts just to count them.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false,"description":"Page number (0-based)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":500},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 500)"},{"schema":{"anyOf":[{"type":"string","enum":["mostRecentOrder","leastRecentOrder","orderSum","grossSum","email","firstName","lastName","fullName","phone","status","createdAt","updatedAt","events_attended","items_purchased","products_purchased"]},{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}]},"in":"query","name":"sortField","required":false,"description":"Field to sort by. Index-backed (fast) values: `mostRecentOrder`,\n`orderSum`, `grossSum`. Other enum values + 24-char hex custom-\nproperty ids are accepted and sorted in-memory by the database —\nfine at per-page volumes but avoid on large hosts. Defaults to\n`mostRecentOrder` desc."},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false,"description":"Sort direction. Defaults to desc when sortField is provided."},{"schema":{"type":"string","enum":["all","opted-in","unknown","unsubscribed","imported"]},"in":"query","name":"filter","required":false,"description":"Quick status filter; case-insensitive. \"all\" or omit for no filter. ANDed with `filters` when both supplied."},{"schema":{"type":"string"},"in":"query","name":"filters","required":false,"description":"JSON-encoded array of filter groups for advanced filtering.\nEach group has \"logic\" (\"and\" | \"or\") and \"conditions\" (array of conditions or nested groups).\nEach condition has \"field\", \"operator\", and optional \"value\".\nOperators by type:\n- Text: is_equal_to_any_of, is_not_equal_to_any_of, contains, contains_exactly\n- Date: is_before, is_after, is_between (value: {start, end})\n- Number: is_equal_to, is_not_equal_to, is_greater_than, is_greater_than_or_equal_to, is_less_than, is_less_than_or_equal_to, is_between\n- Select: is_any_of, is_none_of\n- Common: is_empty, is_not_empty\nConditions referencing fields outside the persisted contact schema are silently ignored.\nExample: [{\"logic\":\"and\",\"conditions\":[{\"field\":\"status\",\"operator\":\"is_any_of\",\"value\":[\"opted-in\"]},{\"field\":\"grossSum\",\"operator\":\"is_greater_than\",\"value\":1000}]}]"},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Free-text search over email, firstName, lastName, fullName"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"fullName":{"type":"string"},"email":{"type":"string"},"billingEmail":{"type":"string"},"phone":{"type":"string"},"vendorId":{"type":"string"},"orderSum":{"type":"number"},"grossSum":{"type":"number"},"firstOrder":{"description":"First order, ms since epoch","type":"number"},"lastOrder":{"description":"Most recent order, ms since epoch","type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"status":{"type":"string","enum":["unsubscribed","opted-in","unknown","imported"],"description":"Subset of statuses surfaced on the compact contact projection. Deleted contacts are never listed."},"eventsAttended_IDS":{"type":"array","items":{"type":"string"}},"itemsPurchased_IDS":{"type":"array","items":{"type":"string"}},"productsPurchased_IDS":{"type":"array","items":{"type":"string"}}},"required":["id","firstName","lastName","fullName","email","vendorId","orderSum","grossSum","status","eventsAttended_IDS","itemsPurchased_IDS","productsPurchased_IDS"],"additionalProperties":{}}},"hasMore":{"type":"boolean"},"pageNumber":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pageSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["data","hasMore","pageNumber","pageSize"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Contact","tags":["Contacts"],"description":"Creates a new contact. Fails with 409 if a contact with the same\nemail already exists for the host — callers wanting \"create or\nfetch existing\" behaviour should use the host management site upsert flow instead.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Contact email — unique per host, lowercased on persist"},"billingEmail":{"description":"Billing / invoice-receipt email. Defaults to the contact email when omitted.","type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"}},"required":["email"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"fullName":{"type":"string"},"email":{"type":"string"},"billingEmail":{"type":"string"},"phone":{"type":"string"},"vendorId":{"type":"string"},"orderSum":{"type":"number"},"grossSum":{"type":"number"},"firstOrder":{"description":"First order, ms since epoch","type":"number"},"lastOrder":{"description":"Most recent order, ms since epoch","type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"status":{"type":"string","enum":["unsubscribed","opted-in","unknown","imported"],"description":"Subset of statuses surfaced on the compact contact projection. Deleted contacts are never listed."},"eventsAttended_IDS":{"type":"array","items":{"type":"string"}},"itemsPurchased_IDS":{"type":"array","items":{"type":"string"}},"productsPurchased_IDS":{"type":"array","items":{"type":"string"}}},"required":["id","firstName","lastName","fullName","email","vendorId","orderSum","grossSum","status","eventsAttended_IDS","itemsPurchased_IDS","productsPurchased_IDS"],"additionalProperties":{}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/count":{"get":{"summary":"Count Contacts","tags":["Contacts"],"description":"Returns the total contact count for the host.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/bulk":{"post":{"summary":"Bulk Upsert Contacts","tags":["Contacts"],"description":"Upserts up to many contacts in one round-trip, deduplicated server-side by email. Partial-safe: scalar fieldsupdate only when supplied, and custom properties merge by property_id (supplied properties are added/overwritten, omitted ones are preserved). Never wipes properties you do not resend.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contacts":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string","nullable":true},"status":{"type":"string","enum":["deleted","imported","unsubscribed","opted-in","unknown"],"description":"Contact lifecycle status.\n- opted-in / unsubscribed: explicit consent state\n- unknown: never recorded a choice\n- imported / deleted: lifecycle states from list imports / soft-deletes"},"properties":{"description":"Custom properties to upsert, merged by property_id. Properties you include are added or overwritten; properties already on the contact that you omit are left untouched. You do NOT need to resend a contact's existing properties to preserve them.","type":"array","items":{"type":"object","properties":{"property_id":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"boolean"},{"type":"number"}]}},"required":["property_id","value"]}},"eventsAttended_IDS":{"type":"array","items":{"type":"string"}},"itemsPurchased_IDS":{"type":"array","items":{"type":"string"}},"productsPurchased_IDS":{"type":"array","items":{"type":"string"}}},"required":["email"],"additionalProperties":{}},"description":"Contacts to upsert, deduped server-side by email. Existing rows are updated in place: scalar fields (name, phone, status) update only when you supply them, and custom properties merge by property_id — supplied properties are added/overwritten, omitted ones are preserved. Capped at 1000 per request — clients batch larger imports."}},"required":["contacts"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/{id}":{"get":{"summary":"Get Contact","tags":["Contacts"],"description":"Retrieves a single contact by id.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id, discoverable via list_contacts"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"fullName":{"type":"string"},"email":{"type":"string"},"billingEmail":{"type":"string"},"phone":{"type":"string"},"vendorId":{"type":"string"},"orderSum":{"type":"number"},"grossSum":{"type":"number"},"firstOrder":{"description":"First order, ms since epoch","type":"number"},"lastOrder":{"description":"Most recent order, ms since epoch","type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"status":{"type":"string","enum":["unsubscribed","opted-in","unknown","imported"],"description":"Subset of statuses surfaced on the compact contact projection. Deleted contacts are never listed."},"eventsAttended_IDS":{"type":"array","items":{"type":"string"}},"itemsPurchased_IDS":{"type":"array","items":{"type":"string"}},"productsPurchased_IDS":{"type":"array","items":{"type":"string"}}},"required":["id","firstName","lastName","fullName","email","vendorId","orderSum","grossSum","status","eventsAttended_IDS","itemsPurchased_IDS","productsPurchased_IDS"],"additionalProperties":{}}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Contact","tags":["Contacts"],"description":"Updates a contact. Optionally merges another contact into the target when `mergeWith` is set.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"billingEmail":{"anyOf":[{"anyOf":[{"type":"string","format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"string","enum":[""]}]},{"nullable":true,"enum":[null]}]},"phone":{"type":"string","nullable":true},"status":{"type":"string","enum":["deleted","imported","unsubscribed","opted-in","unknown"],"description":"Contact lifecycle status.\n- opted-in / unsubscribed: explicit consent state\n- unknown: never recorded a choice\n- imported / deleted: lifecycle states from list imports / soft-deletes"}},"required":["firstName","lastName","email","status"],"description":"New contact field values"},"mergeWith":{"description":"Id of a second contact to absorb into the target during this update.\nSet when an email change collides with another existing contact.","type":"string"},"resolution":{"description":"Required when `mergeWith` is set; chooses how field-level\nconflicts resolve.","type":"string","enum":["safe-merge","overwrite-merge"]}},"required":["contact"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id, discoverable via list_contacts"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"_id":{"type":"string"},"email":{"type":"string"},"billingEmail":{"type":"string"},"vendorId":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"fullName":{"type":"string"},"phone":{"type":"string","nullable":true},"status":{"type":"string","enum":["deleted","imported","unsubscribed","opted-in","unknown"],"description":"Contact lifecycle status.\n- opted-in / unsubscribed: explicit consent state\n- unknown: never recorded a choice\n- imported / deleted: lifecycle states from list imports / soft-deletes"},"grossSum":{"type":"number"},"orderSum":{"type":"number"},"leastRecentOrder":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"mostRecentOrder":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"events_attended":{"type":"array","items":{"type":"string"}},"items_purchased":{"type":"array","items":{"type":"string"}},"products_purchased":{"type":"array","items":{"type":"string"}},"properties":{"type":"array","items":{"type":"object","properties":{"property_id":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"boolean"},{"type":"number"}]}},"required":["property_id","value"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["_id","email","vendorId","firstName","lastName","fullName","status","grossSum","orderSum","events_attended","items_purchased","products_purchased"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Contact","tags":["Contacts"],"description":"Removes a contact by id.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id, discoverable via list_contacts"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/{id}/activity":{"get":{"summary":"Get Contact Activity","tags":["Contacts"],"description":"Paginated activity log for a contact (checkouts, refunds, scans, emails, invoice payments).","parameters":[{"schema":{"type":"string","enum":["checkout_session_completed","product_set_checkout_session_completed","order_refunded","ticket_scanned","email_sent","invoice_paid","invoice_sent","invoice_send_failed","email_delivered","email_bounced"]},"in":"query","name":"filter","required":false,"description":"Restrict to a single activity type"},{"schema":{"type":"string","enum":["oldest"]},"in":"query","name":"sort","required":false,"description":"Default is newest-first; \"oldest\" reverses"},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id, discoverable via list_contacts"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"_id":{"type":"string"},"vendor_id":{"type":"string"},"email":{"type":"string"},"contact_id":{"type":"string"},"type":{"type":"string","enum":["checkout_session_completed","product_set_checkout_session_completed","order_refunded","ticket_scanned","email_sent","invoice_paid","invoice_sent","invoice_send_failed","email_delivered","email_bounced"]},"data":{"type":"object","additionalProperties":{}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["_id","vendor_id","email","type","data","createdAt","updatedAt"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"pageNumber":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pageSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["data","hasMore","pageNumber","pageSize"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/{id}/payment-methods":{"get":{"summary":"Get contact payment method","tags":["Payment methods"],"description":"Retrieves the saved card on file for a contact, or null when none is saved. One card is supported per contact.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id, discoverable via list_contacts"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"contactId":{"type":"string"},"card":{"type":"object","properties":{"brand":{"type":"string"},"last4":{"type":"string"},"expMonth":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expYear":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"country":{"type":"string"},"funding":{"type":"string"}},"required":["brand","last4","expMonth","expYear"],"additionalProperties":false},"billingDetails":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"addressLine1":{"type":"string"},"addressLine2":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"postalCode":{"type":"string"},"country":{"type":"string"}},"additionalProperties":false},"status":{"type":"string","enum":["active","detached","expired"]},"detachedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","contactId","card","status","createdAt","updatedAt"],"additionalProperties":false,"nullable":true}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Attach a saved payment method","tags":["Payment methods"],"description":"Persists the card from a confirmed SetupIntent against the contact.\nThe SetupIntent is re-verified server-side (status + scope) before the\ncard is saved. Replaces any existing card on file for the contact.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"setupIntentId":{"type":"string","description":"Stripe SetupIntent id confirmed on the client"}},"required":["setupIntentId"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id, discoverable via list_contacts"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"contactId":{"type":"string"},"card":{"type":"object","properties":{"brand":{"type":"string"},"last4":{"type":"string"},"expMonth":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expYear":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"country":{"type":"string"},"funding":{"type":"string"}},"required":["brand","last4","expMonth","expYear"],"additionalProperties":false},"billingDetails":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"addressLine1":{"type":"string"},"addressLine2":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"postalCode":{"type":"string"},"country":{"type":"string"}},"additionalProperties":false},"status":{"type":"string","enum":["active","detached","expired"]},"detachedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","contactId","card","status","createdAt","updatedAt"],"additionalProperties":false},"replacedExisting":{"type":"boolean"}},"required":["data","replacedExisting"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/{id}/payment-methods/setup-intent":{"post":{"summary":"Start saving a payment method","tags":["Payment methods"],"description":"Begins saving a card for a contact. Returns a Stripe SetupIntent\n`clientSecret` to confirm client-side with Stripe Elements (the card\nnever touches our servers). After the client confirms, call the attach\nendpoint with the returned `setupIntentId` to persist the card.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id, discoverable via list_contacts"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"setupIntentId":{"type":"string"},"clientSecret":{"type":"string"},"customerId":{"type":"string"}},"required":["setupIntentId","clientSecret","customerId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/contacts/{id}/payment-methods/{methodId}":{"delete":{"summary":"Remove a saved payment method","tags":["Payment methods"],"description":"Detaches the saved card from Stripe and removes it from the contact.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Contact id"},{"schema":{"type":"string"},"in":"path","name":"methodId","required":true,"description":"Payment method id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"removed":{"type":"boolean"}},"required":["removed"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/":{"get":{"summary":"List Emails","tags":["Email"],"description":"Lists the workspace's emails, optionally filtered by view (draft / past).\nPaginated; returns recipient-stripped summaries so list payloads stay small.\nSorted by updatedAt descending.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false},{"schema":{"default":20,"type":"integer","exclusiveMinimum":true,"maximum":100,"minimum":0},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string","enum":["past","sent","scheduled","draft"]},"in":"query","name":"view","required":false,"description":"Filter by view; omit to include drafts + sent + scheduled."},{"schema":{"type":"string"},"in":"query","name":"filters","required":false,"description":"JSON-encoded FilterGroup[] for custom filtering. Conditions referencing\nfields outside the persisted email schema are ignored. ANDed with the 'view'\nfilter when both are supplied."},{"schema":{"type":"string","enum":["_id","subject","sent","date_sent","recipient_count","automatic","sync_event_recipients","data_version","status","open_rate","click_rate","revenue_generated","createdAt","updatedAt"]},"in":"query","name":"sortField","required":false,"description":"Field to sort results by. Omit for default (updatedAt descending)."},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false,"description":"Sort direction. Defaults to desc when sortField is provided."},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Case-insensitive subject substring to search for."},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Omit for all fields. Valid fields:\nid, hostId, subject, sent, date_sent, reply_to_email, automatic, display_name, page_id, data_version, sync_event_recipients, attachments, sparkpost_metrics, activity_synced_at, createdAt, updatedAt, recipient_count"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"hasMore":{"type":"boolean","description":"If true, there are more pages of results available."},"pageNumber":{"type":"number"},"pageSize":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."},"recipient_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of recipients for this email."}},"additionalProperties":false}}},"required":["hasMore","pageNumber","pageSize","data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Email","tags":["Email"],"description":"Creates a new email (draft by default). A new email renders a Page: set\n`page_id` to the id of the page it should render. Recipient emails with\ntypo-looking domains (e.g. gmial.com) are stripped before persistence.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string","description":"The email subject."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"]}},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"}},"additionalProperties":false}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"body":{"type":"string","description":"The rendered HTML body. Populated on send, empty on drafts."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"content_blocks":{"description":"Deprecated legacy content. New emails use page_id instead.","type":"array","items":{}},"viewport_data":{"description":"Deprecated embedded structured content. New emails use page_id instead."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}":{"get":{"summary":"Get Email","tags":["Email"],"description":"Retrieves a single email by id, including its full recipient list and attachments.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Omit for all fields. Valid fields:\nid, hostId, subject, body, sent, recipient_emails, recipient_phonenumbers, event_refs, timeslot_refs, segment_refs, date_sent, footer_image, reply_to_email, automatic, display_name, content_blocks, viewport_data, page_id, data_version, sync_event_recipients, attachments, sparkpost_metrics, activity_synced_at, createdAt, updatedAt"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"body":{"type":"string","description":"The rendered HTML body. Populated on send, empty on drafts."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"content_blocks":{"description":"Deprecated legacy content. New emails use page_id instead.","type":"array","items":{}},"viewport_data":{"description":"Deprecated embedded structured content. New emails use page_id instead."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Email","tags":["Email"],"description":"Updates an email's fields. Only provided fields change. The content field\naccepted depends on the email's format: an email that renders a Page accepts\n`page_id`; an email that renders embedded structured content accepts\n`viewport_data`. Emails in the content_blocks format cannot be edited\nthrough this API. If recipient_emails is supplied, typo-domain addresses are\nstripped.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string","description":"The email subject."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"viewport_data":{"type":"object","properties":{"pages":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"page:1\". Emails typically have a single page."},"layouts":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"layout:1\". Unique within the page."},"type":{"type":"string","enum":["one-column"]},"content":{"type":"string","description":"HTML rendered by the email editor (TipTap-based).\nAllowed: <p>, <h1>-<h6>, <strong>/<b>, <em>/<i>, <u>, <s>, <a href>,\n<ul>/<ol>/<li>, <img src alt>, <hr>, <br>, <blockquote>,\n<table>/<tr>/<td>/<th>, <span> for emoji, youtube iframes (YouTube\nembed extension). Text alignment via inline style=\"text-align: left|\ncenter|right\" on block elements.\nDisallowed: inline color/background-color/font-family/font-size (the\neditor has no UI for them — they get stripped on re-edit), custom CSS\nclasses, <script>/<style>. Use heading levels (h1-h6) for size, not\ninline font-size.\nDo NOT include {{unsubscribeUrl}} or any other {{…}} placeholder —\nthe send pipeline adds the unsubscribe footer automatically."},"cardHeight":{"type":"number","description":"Minimum row height in pixels. Default 100."}},"required":["id","type","content","cardHeight"]},{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"layout:2\". Unique within the page."},"type":{"type":"string","enum":["two-column"]},"columns":{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"string"}]},"minItems":2,"maxItems":2,"description":"Tuple [leftHTML, rightHTML]. Same HTML rules as one-column.content\n(see its description)."},"dividerPos":{"type":"number","minimum":0,"maximum":1,"description":"Column split as a fraction (0-1). 0.5 = equal halves."},"cardHeight":{"type":"number","description":"Minimum row height in pixels. Default 100."}},"required":["id","type","columns","dividerPos","cardHeight"]},{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"layout:3\"."},"type":{"type":"string","enum":["event-block"]},"event":{"description":"Omit only for placeholder blocks the user will fill in via the UI.","type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Event detail page URL. Must follow the format\nhttps://3common.com/event/{event_id} where {event_id} is the event\nref id (the same id stored on the email's event_refs array).\nNever construct ad-hoc URLs — recipients expect canonical 3common.com\nlinks so referral tracking and unsubscribe substitution work."},"image":{"description":"Image URL displayed at the top of the event card. Pick from, in\norder of preference:\n1. The event's own image (from get_event / list_events on the\nevent referenced by this email's event_refs).\n2. A URL the user explicitly supplied in this conversation.\n3. A URL surfaced via the web_search / web_fetch tools when\nweb access is enabled — only when (1) and (2) are absent\nAND the user asked for promotional imagery. Cite the source.\nOmit when no suitable image exists; the card renders cleanly\nwithout one. Never invent a URL — broken images degrade trust.","type":"string"},"dates":{"type":"array","items":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"description":"All event dates as ISO-8601 strings. Past dates are filtered out at render time; the earliest future date is the headline."},"timezone":{"type":"object","properties":{"value":{"type":"string","description":"IANA zone, e.g. \"America/Toronto\"."},"offset":{"type":"number","description":"Minutes from UTC at the event time."}},"required":["value","offset"]}},"required":["name","url","dates"]}},"required":["id","type"]}]},"description":"Vertical stack of layouts. Render order = array order."}},"required":["id","layouts"]},"description":"Site-builder document. For emails this is almost always a single\npage with a sequence of layout blocks. Each layout is one of:\n- 'one-column': single HTML column (most common)\n- 'two-column': side-by-side HTML columns\n- 'event-block': structured event card (image + name + date + link)\nA minimal valid value:\n{ pages: [{ id: 'page:1', layouts: [\n{ id: 'layout:1', type: 'one-column',\ncontent: '<p>Hi {{name}}!</p>', cardHeight: 100 }\n] }] }"}},"required":["pages"],"description":"Structured site-builder content — the AI-editable representation of\nthe email body. Compose the email by emitting a viewport_data tree\n(pages → layouts → HTML blocks); do NOT supply pre-rendered HTML via\n'body'. The send flow renders viewport_data into HTML automatically.\nMost emails are a single page with a sequence of one-column\nlayouts. Use two-column for side-by-side content, and event-block\nwhen promoting a specific event (give it the event id's url, name,\nand date — never embed event details in an HTML column).\nLayout ids must be unique within the page; \"page:1\", \"layout:1\",\n\"layout:2\", ... is the simplest scheme. Pick cardHeight=100 unless\nthe design calls for taller rows.\nEvent link URLs (whether on event-block.event.url or inside an HTML\n<a href=\"...\"> in a one-column / two-column 'content' / 'columns'\nstring) MUST use the canonical format:\nhttps://3common.com/event/{event_id}\nwhere {event_id} is the id from the email's event_refs array.\nDon't invent ad-hoc URLs — recipients click these to land on the\nreal event page, and referral tracking + unsubscribe substitution\nrely on the canonical host.\nDo NOT include {{unsubscribeUrl}} or any other {{…}} substitution\nplaceholder anywhere in viewport_data. The api-server's email\ntemplate renders the unsubscribe footer itself; emitting it in the\nbody produces a duplicated, broken link.\nStyling beyond what TipTap exposes (custom font colors, font\nfamilies, font sizes outside the h1-h6 progression, background\ncolors) is NOT supported — the editor has no UI for it and round-\ntrips will strip it. Use semantic tags (h1-h6 for size, strong/em\nfor emphasis) instead of inline style."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"]}},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"body":{"type":"string","description":"The rendered HTML body. Populated on send, empty on drafts."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"content_blocks":{"description":"Deprecated legacy content. New emails use page_id instead.","type":"array","items":{}},"viewport_data":{"description":"Deprecated embedded structured content. New emails use page_id instead."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Email","tags":["Email"],"description":"Permanently deletes an email. No soft-delete; the row is removed.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/send":{"post":{"summary":"Send Email","tags":["Email"],"description":"Sends an email through Sparkpost immediately. Stamps date_sent + sent=true\non the persisted document.\nSeamless flow: call with just `id` once the draft has subject, recipients,\nviewport_data, and reply_to_email set. The server pulls those fields from\nthe persisted doc and renders viewport_data to HTML server-side if no body\nis already rendered. Only pass fields other than `id` when you explicitly\nneed to override the persisted values for this one send.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"html":{"description":"Pre-rendered HTML body. Usually omitted, the server renders viewport_data\nautomatically if no body is persisted. Supply only when you need to override\nthe persisted body for this one send.","type":"string"},"subject":{"description":"Override the persisted subject for this send. Newlines are stripped server-side.","type":"string"},"senderName":{"description":"Override the persisted display_name on the From line.","type":"string"},"replyToEmail":{"description":"Override the persisted reply_to_email.","type":"string"},"recipients":{"description":"Override the persisted recipient list. Typo-domain addresses are stripped server-side. For page-based emails this overrides the typed recipients and is still merged with the synced event/timeslot audience.","type":"array","items":{"type":"string"}},"attachments":{"description":"Override the persisted attachments. URLs are downloaded and base64-encoded before transmission to Sparkpost.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"]}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"body":{"type":"string","description":"The rendered HTML body. Populated on send, empty on drafts."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"content_blocks":{"description":"Deprecated legacy content. New emails use page_id instead.","type":"array","items":{}},"viewport_data":{"description":"Deprecated embedded structured content. New emails use page_id instead."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."}},"required":["id","hostId","subject","body","sent","recipient_emails","recipient_phonenumbers","event_refs","footer_image","sync_event_recipients","createdAt","updatedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/schedule":{"post":{"summary":"Schedule Email","tags":["Email"],"description":"Schedules an email for future delivery. Stamps sent=true,\ndate_sent=<sendAt>, and a server-rendered body on the email, then enqueues a\nscheduled job to send the message at sendAt.\nPreconditions checked before scheduling:\n- Email exists and is owned by the caller's workspace\n- sendAt is strictly in the future\n- Email has a non-empty subject\n- Email has at least one recipient\n- Email has viewport_data to render to HTML (or a previously-rendered body)\nFor immediate transmission, use send_email instead.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sendAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO timestamp for delivery. Must be strictly in the future. The\nemail must already have a subject, at least one recipient, and\nviewport_data (the send pipeline renders it to HTML automatically)."}},"required":["sendAt"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"body":{"type":"string","description":"The rendered HTML body. Populated on send, empty on drafts."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"content_blocks":{"description":"Deprecated legacy content. New emails use page_id instead.","type":"array","items":{}},"viewport_data":{"description":"Deprecated embedded structured content. New emails use page_id instead."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."}},"required":["id","hostId","subject","body","sent","recipient_emails","recipient_phonenumbers","event_refs","footer_image","sync_event_recipients","createdAt","updatedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/duplicate":{"post":{"summary":"Duplicate Email","tags":["Email"],"description":"Creates a draft copy of an existing email. The source's content and metadata\n(attachments, sender info, recipients, event refs) are cloned server-side;\nthe caller names the source and any field-level overrides. An email that\nrenders a Page accepts a `page_id` override; an email that renders\nembedded structured content accepts a `viewport_data` override. Emails in\nthe content_blocks format cannot be duplicated through this API. Note that\nif `page_id` is omitted, a duplicate of the page is also created and used\nfor the new email, so editing the new email's page will not affect others.\nUse this when the user asks to \"duplicate\", \"clone\", \"copy\", or \"resend\" an\nexisting email, including the \"duplicate and send to a different address\"\nflow. After this tool returns, call send_email with the returned email's id\nto dispatch immediately, or schedule_email for a future send.\nThe duplicate is always created as a draft: sent=false, no date_sent,\nautomatic=false. Override only the fields that should differ from the source\n(most commonly recipient_emails); everything else falls back to the source.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"description":"Subject on the copy. Defaults to the source subject.","type":"string"},"recipient_emails":{"description":"Recipient list on the copy. Defaults to the source's recipients.\nTypo-domain addresses are stripped server-side. Pass an explicit\nlist (e.g. just the one address being re-sent to) when the caller\nasks to \"duplicate and send to X\".","type":"array","items":{"type":"string"}},"recipient_phonenumbers":{"type":"array","items":{"type":"string"}},"event_refs":{"type":"array","items":{"type":"string"}},"timeslot_refs":{"type":"array","items":{"type":"string"}},"footer_image":{"type":"string"},"reply_to_email":{"description":"Reply-to email on the copy. Defaults to source.","type":"string"},"display_name":{"description":"From-line display name on the copy. Defaults to source.","type":"string"},"sync_event_recipients":{"type":"boolean"},"attachments":{"description":"Override attachments on the copy. Defaults to the source attachments.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"]}},"page_id":{"description":"Page ID for the copy. Valid only when the source already uses a page_id. By\ndefault, a copy of the source email's page will be created, meaning the new\nemail will have a different page_id from the original.","type":"string"},"viewport_data":{"description":"Structured content for the copy. Valid only when the source renders embedded content; defaults to the source content.","type":"object","properties":{"pages":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"page:1\". Emails typically have a single page."},"layouts":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"layout:1\". Unique within the page."},"type":{"type":"string","enum":["one-column"]},"content":{"type":"string","description":"HTML rendered by the email editor (TipTap-based).\nAllowed: <p>, <h1>-<h6>, <strong>/<b>, <em>/<i>, <u>, <s>, <a href>,\n<ul>/<ol>/<li>, <img src alt>, <hr>, <br>, <blockquote>,\n<table>/<tr>/<td>/<th>, <span> for emoji, youtube iframes (YouTube\nembed extension). Text alignment via inline style=\"text-align: left|\ncenter|right\" on block elements.\nDisallowed: inline color/background-color/font-family/font-size (the\neditor has no UI for them — they get stripped on re-edit), custom CSS\nclasses, <script>/<style>. Use heading levels (h1-h6) for size, not\ninline font-size.\nDo NOT include {{unsubscribeUrl}} or any other {{…}} placeholder —\nthe send pipeline adds the unsubscribe footer automatically."},"cardHeight":{"type":"number","description":"Minimum row height in pixels. Default 100."}},"required":["id","type","content","cardHeight"]},{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"layout:2\". Unique within the page."},"type":{"type":"string","enum":["two-column"]},"columns":{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"string"}]},"minItems":2,"maxItems":2,"description":"Tuple [leftHTML, rightHTML]. Same HTML rules as one-column.content\n(see its description)."},"dividerPos":{"type":"number","minimum":0,"maximum":1,"description":"Column split as a fraction (0-1). 0.5 = equal halves."},"cardHeight":{"type":"number","description":"Minimum row height in pixels. Default 100."}},"required":["id","type","columns","dividerPos","cardHeight"]},{"type":"object","properties":{"id":{"type":"string","description":"Stable id like \"layout:3\"."},"type":{"type":"string","enum":["event-block"]},"event":{"description":"Omit only for placeholder blocks the user will fill in via the UI.","type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","description":"Event detail page URL. Must follow the format\nhttps://3common.com/event/{event_id} where {event_id} is the event\nref id (the same id stored on the email's event_refs array).\nNever construct ad-hoc URLs — recipients expect canonical 3common.com\nlinks so referral tracking and unsubscribe substitution work."},"image":{"description":"Image URL displayed at the top of the event card. Pick from, in\norder of preference:\n1. The event's own image (from get_event / list_events on the\nevent referenced by this email's event_refs).\n2. A URL the user explicitly supplied in this conversation.\n3. A URL surfaced via the web_search / web_fetch tools when\nweb access is enabled — only when (1) and (2) are absent\nAND the user asked for promotional imagery. Cite the source.\nOmit when no suitable image exists; the card renders cleanly\nwithout one. Never invent a URL — broken images degrade trust.","type":"string"},"dates":{"type":"array","items":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"description":"All event dates as ISO-8601 strings. Past dates are filtered out at render time; the earliest future date is the headline."},"timezone":{"type":"object","properties":{"value":{"type":"string","description":"IANA zone, e.g. \"America/Toronto\"."},"offset":{"type":"number","description":"Minutes from UTC at the event time."}},"required":["value","offset"]}},"required":["name","url","dates"]}},"required":["id","type"]}]},"description":"Vertical stack of layouts. Render order = array order."}},"required":["id","layouts"]},"description":"Site-builder document. For emails this is almost always a single\npage with a sequence of layout blocks. Each layout is one of:\n- 'one-column': single HTML column (most common)\n- 'two-column': side-by-side HTML columns\n- 'event-block': structured event card (image + name + date + link)\nA minimal valid value:\n{ pages: [{ id: 'page:1', layouts: [\n{ id: 'layout:1', type: 'one-column',\ncontent: '<p>Hi {{name}}!</p>', cardHeight: 100 }\n] }] }"}},"required":["pages"]}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"body":{"type":"string","description":"The rendered HTML body. Populated on send, empty on drafts."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"content_blocks":{"description":"Deprecated legacy content. New emails use page_id instead.","type":"array","items":{}},"viewport_data":{"description":"Deprecated embedded structured content. New emails use page_id instead."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/cancel-schedule":{"post":{"summary":"Cancel Scheduled Email","tags":["Email"],"description":"Unschedules a scheduled send and reverts the email to a draft.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string","description":"ID of the host workspace that owns this email."},"subject":{"type":"string","description":"The email subject."},"body":{"type":"string","description":"The rendered HTML body. Populated on send, empty on drafts."},"sent":{"type":"boolean","description":"False for drafts; true once sent or scheduled."},"recipient_emails":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses. Note that if `sync_event_recipients` is true,\nthis will not include event attendees until send time."},"recipient_phonenumbers":{"type":"array","items":{"type":"string"},"description":"Unused."},"event_refs":{"type":"array","items":{"type":"string"},"description":"IDs of events whose attendees will be added to the recipients at send time."},"timeslot_refs":{"description":"IDs of multi-day event timeslots whose attendees will be added to the\nrecipients at send time.","type":"array","items":{"type":"string"}},"segment_refs":{"description":"IDs of segments whose members will be added to the recipients at send\ntime, with each member's segment columns available as smart values\n(mail merge). The composer currently imports a single segment.","type":"array","items":{"type":"string"}},"date_sent":{"description":"When the email was sent or is scheduled to send, as an ISO string. Undefined for drafts.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"footer_image":{"type":"string","description":"URL of the image shown in the email footer."},"reply_to_email":{"description":"Reply-to address. Falls back to a system address when unset.","type":"string"},"automatic":{"description":"Whether this email was generated by the automatic event-broadcast flow.","type":"boolean"},"display_name":{"description":"Sender label shown on the \"From\" line.","type":"string"},"content_blocks":{"description":"Deprecated legacy content. New emails use page_id instead.","type":"array","items":{}},"viewport_data":{"description":"Deprecated embedded structured content. New emails use page_id instead."},"page_id":{"description":"ID of the Page this email renders.","type":"string"},"data_version":{"description":"Which content format this email uses. Assume `content_blocks` (0) when absent.","type":"number","enum":[0,1,2]},"sync_event_recipients":{"type":"boolean","description":"If true, scheduled sends re-sync recipients from the linked events at send time."},"attachments":{"description":"File attachments included with the email.","type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"The original filename of the attachment."},"size":{"type":"number","description":"File size in bytes."},"url":{"type":"string","description":"Publicly fetchable URL."},"type":{"type":"string","description":"MIME type, e.g. `application/pdf`, `image/jpeg`."},"uploading":{"type":"boolean"},"uploadError":{"type":"string"},"storagePath":{"type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"description":"Delivery metrics and referral revenue for a sent email.","type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total messages sent."},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Messages delivered to a recipient inbox (no bounce)."},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique opens, counted by distinct recipient."},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique clicks, counted by distinct recipient."},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Bounced messages (hard and soft)."},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Recipients who unsubscribed."},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"10.0%\""},"click_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"1.5%\""},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units (cents)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"fetched_at":{"description":"Epoch ms when these metrics were last fetched from Sparkpost","type":"number"}},"required":["count_sent","count_delivered","count_opens","count_clicks","count_bounce","count_unsubscribe","bounce_rate","open_rate","click_rate"],"additionalProperties":false},"activity_synced_at":{"description":"Epoch ms when the activity feed was last synced from Sparkpost + orders.","type":"number"},"createdAt":{"type":"number","description":"Creation time, in epoch milliseconds."},"updatedAt":{"type":"number","description":"Last-updated time, in epoch milliseconds."}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/events":{"get":{"summary":"List Email Events","tags":["Email"],"description":"Lists Sparkpost bounce or open events for a sent email. Returns one\ncursor-paginated page. Events outside the (date_sent - 1 day, now + 1 day)\nwindow aren't returned even if they exist.","parameters":[{"schema":{"type":"string","enum":["bounce","open"]},"in":"query","name":"event","required":true,"description":"Sparkpost event class to fetch.\n- bounce: hard/soft bounce, with reason + error code\n- open: unique open events"},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"Sparkpost cursor token; omit for the first page"},{"schema":{"default":50,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 50, max 100)"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"hasMore":{"type":"boolean"},"cursor":{"type":"string"},"nextCursor":{"type":"string","nullable":true},"pageSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"data":{"type":"array","items":{"type":"object","properties":{"recipient":{"type":"string"},"event_type":{"type":"string"},"event_id":{"type":"string"},"timestamp":{"type":"string"},"bounce_class":{"type":"string"},"error_code":{"type":"string"},"reason":{"type":"string"},"user_agent":{"type":"string"},"ip":{"type":"string"},"click_tracking":{"type":"boolean"},"url":{"type":"string"}},"required":["recipient","event_type","timestamp"],"additionalProperties":false}}},"required":["hasMore","cursor","nextCursor","pageSize","data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/activity":{"get":{"summary":"List Email Activity","tags":["Email"],"description":"Lists a sent campaign's activity feed (delivered / open / click / bounce /\nunsubscribe events plus attributed orders) from the stored feed. Paginated;\nfilter to one kind with 'view', search recipients with 'search'. Call\nsync_email_activity first if the feed looks stale.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false},{"schema":{"default":20,"type":"integer","exclusiveMinimum":true,"maximum":500,"minimum":0},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string"},"in":"query","name":"filters","required":false,"description":"JSON-encoded FilterGroup[] for view / custom filtering."},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Case-insensitive recipient substring."},{"schema":{"type":"string","enum":["timestamp","recipient","eventType"]},"in":"query","name":"sortField","required":false,"description":"Whitelist of fields which can be sorted by when listing activity."},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"hasMore":{"type":"boolean"},"pageNumber":{"type":"number"},"pageSize":{"type":"number"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"emailId":{"type":"string"},"recipient":{"type":"string"},"eventType":{"type":"string","enum":["delivered","open","initial_open","click","bounce","unsubscribe","spam_complaint","order"],"description":"Kind of activity row in the campaign report feed. All but 'order' map to\nSparkpost message-events; 'order' is a conversion row attributed via the\nReferral + View join. 'initial_open' (first open) is tracked separately from\n'open' (any open, incl. mail-client prefetch)."},"timestamp":{"type":"number","description":"Event time, epoch ms."},"url":{"type":"string"},"bounceClass":{"type":"string"},"reason":{"type":"string"},"orderId":{"type":"string"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","emailId","recipient","eventType","timestamp"],"additionalProperties":false}}},"required":["hasMore","pageNumber","pageSize","data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/activity/daily":{"get":{"summary":"Email activity daily counts","tags":["Email"],"description":"Daily counts per event kind for a sent campaign, for charting.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"day":{"type":"string","description":"UTC calendar day, `YYYY-MM-DD`."},"eventType":{"type":"string","enum":["delivered","open","initial_open","click","bounce","unsubscribe","spam_complaint","order"],"description":"Kind of activity row in the campaign report feed. All but 'order' map to\nSparkpost message-events; 'order' is a conversion row attributed via the\nReferral + View join. 'initial_open' (first open) is tracked separately from\n'open' (any open, incl. mail-client prefetch)."},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["day","eventType","count"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/activity/summary":{"get":{"summary":"Email activity summary","tags":["Email"],"description":"Unique-recipient engagement totals (delivered / opened / clicked / unsubscribed) for a sent campaign.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Distinct recipients with a delivery event."},"opened":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Distinct recipients who opened (open or initial_open)."},"clicked":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Distinct recipients who clicked."},"unsubscribed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Distinct recipients who unsubscribed."}},"required":["delivered","opened","clicked","unsubscribed"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/email/{id}/activity/sync":{"post":{"summary":"Sync Email Activity","tags":["Email"],"description":"Refreshes a sent campaign's activity feed by pulling the latest Sparkpost\nengagement events and attributed orders into storage. Idempotent: re-running\nonly adds events seen since the last sync. Returns how many rows were added.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Email id, discoverable via list_emails"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"inserted":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Rows newly inserted this sync."},"scanned":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Rows considered (Sparkpost events + orders)."},"syncedAt":{"type":"number","description":"Sync completion time, epoch ms."}},"required":["inserted","scanned","syncedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/entitlements/":{"get":{"summary":"List Entitlements","tags":["Entitlements"],"description":"Lists entitlement balance records for the host. Filterable by contact, feature, or minimum balance. Sorted by most-recently-updated.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string"},"in":"query","name":"contactId","required":false,"description":"Filter by recipient contact id"},{"schema":{"type":"string"},"in":"query","name":"featureKey","required":false,"description":"Filter by feature"},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"minBalance","required":false,"description":"Only entitlements with balance >= this"},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields. Valid: id, hostId, contactId, featureKey, balance, totalGranted, totalConsumed, createdAt, updatedAt. Omit for all."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"type":"string"},"featureKey":{"type":"string"},"balance":{"type":"integer","minimum":0,"maximum":9007199254740991},"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string","enum":["subscription_recurring","one_time_addon","manual"],"description":"Source of an entitlement grant.\n- subscription_recurring: cycle grant from a subscription renewal\n- one_time_addon: top-up purchase (consumed first by ConsumeEntitlement)\n- manual: admin-applied grant"},"sourceId":{"type":"string"},"priceId":{"type":"string"},"amount":{"type":"integer","minimum":1,"maximum":9007199254740991},"remaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"addedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","source","amount","remaining","addedAt"],"additionalProperties":false}},"totalGranted":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalConsumed":{"type":"integer","minimum":0,"maximum":9007199254740991},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/entitlements/lookup":{"get":{"summary":"Look Up Entitlement by Customer + Feature","tags":["Entitlements"],"description":"Looks up the unique entitlement record for a (contact, feature) pair. Returns 404 if no record exists yet.","parameters":[{"schema":{"type":"string"},"in":"query","name":"contactId","required":true,"description":"CRM contact id"},{"schema":{"type":"string"},"in":"query","name":"featureKey","required":true,"description":"Feature key"},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields. Valid: id, hostId, contactId, featureKey, balance, grants, totalGranted, totalConsumed, metadata, createdAt, updatedAt. Omit for all."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"type":"string"},"featureKey":{"type":"string"},"balance":{"type":"integer","minimum":0,"maximum":9007199254740991},"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string","enum":["subscription_recurring","one_time_addon","manual"],"description":"Source of an entitlement grant.\n- subscription_recurring: cycle grant from a subscription renewal\n- one_time_addon: top-up purchase (consumed first by ConsumeEntitlement)\n- manual: admin-applied grant"},"sourceId":{"type":"string"},"priceId":{"type":"string"},"amount":{"type":"integer","minimum":1,"maximum":9007199254740991},"remaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"addedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","source","amount","remaining","addedAt"],"additionalProperties":false}},"totalGranted":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalConsumed":{"type":"integer","minimum":0,"maximum":9007199254740991},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/entitlements/{id}":{"get":{"summary":"Get Entitlement","tags":["Entitlements"],"description":"Retrieves a single entitlement record by id, including grant history.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields. Valid: id, hostId, contactId, featureKey, balance, grants, totalGranted, totalConsumed, metadata, createdAt, updatedAt. Omit for all."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Entitlement id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"type":"string"},"featureKey":{"type":"string"},"balance":{"type":"integer","minimum":0,"maximum":9007199254740991},"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string","enum":["subscription_recurring","one_time_addon","manual"],"description":"Source of an entitlement grant.\n- subscription_recurring: cycle grant from a subscription renewal\n- one_time_addon: top-up purchase (consumed first by ConsumeEntitlement)\n- manual: admin-applied grant"},"sourceId":{"type":"string"},"priceId":{"type":"string"},"amount":{"type":"integer","minimum":1,"maximum":9007199254740991},"remaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"addedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","source","amount","remaining","addedAt"],"additionalProperties":false}},"totalGranted":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalConsumed":{"type":"integer","minimum":0,"maximum":9007199254740991},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/entitlements/grants":{"post":{"summary":"Grant Manual Entitlement","tags":["Entitlements"],"description":"Adds a manual entitlement grant for a (contact, feature). Useful for admin top-ups, comp credits, or migration. Idempotent on grantId.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactId":{"type":"string","description":"CRM contact id"},"featureKey":{"type":"string","description":"Feature key"},"amount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Units to grant"},"grantId":{"type":"string","description":"Caller-supplied grant id for idempotency"},"metadata":{"description":"Metadata applied if the entitlement record is being created (first grant).","type":"object","additionalProperties":{"type":"string"}}},"required":["contactId","featureKey","amount","grantId"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"type":"string"},"featureKey":{"type":"string"},"balance":{"type":"integer","minimum":0,"maximum":9007199254740991},"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string","enum":["subscription_recurring","one_time_addon","manual"],"description":"Source of an entitlement grant.\n- subscription_recurring: cycle grant from a subscription renewal\n- one_time_addon: top-up purchase (consumed first by ConsumeEntitlement)\n- manual: admin-applied grant"},"sourceId":{"type":"string"},"priceId":{"type":"string"},"amount":{"type":"integer","minimum":1,"maximum":9007199254740991},"remaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"addedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","source","amount","remaining","addedAt"],"additionalProperties":false}},"totalGranted":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalConsumed":{"type":"integer","minimum":0,"maximum":9007199254740991},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/entitlements/consume":{"post":{"summary":"Consume Entitlement","tags":["Entitlements"],"description":"Debits units from a customer's entitlement balance. Throws on insufficient balance. Debits one_time_addon grants first, then manual, then subscription_recurring (FIFO within source).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactId":{"type":"string","description":"CRM contact id"},"featureKey":{"type":"string","description":"Feature key"},"amount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Units to consume"},"reason":{"description":"Free-form reason logged on the consumed event","type":"string"}},"required":["contactId","featureKey","amount"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"type":"string"},"featureKey":{"type":"string"},"balance":{"type":"integer","minimum":0,"maximum":9007199254740991},"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":"string","enum":["subscription_recurring","one_time_addon","manual"],"description":"Source of an entitlement grant.\n- subscription_recurring: cycle grant from a subscription renewal\n- one_time_addon: top-up purchase (consumed first by ConsumeEntitlement)\n- manual: admin-applied grant"},"sourceId":{"type":"string"},"priceId":{"type":"string"},"amount":{"type":"integer","minimum":1,"maximum":9007199254740991},"remaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"addedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","source","amount","remaining","addedAt"],"additionalProperties":false}},"totalGranted":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalConsumed":{"type":"integer","minimum":0,"maximum":9007199254740991},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/events/":{"get":{"summary":"List Events","tags":["Events"],"description":"Lists the organizer's events, optionally filtered by status or searched by name/address. Sorted by start date descending. Paginated.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false,"description":"Page number (0-based, default 0)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 100)"},{"schema":{"type":"string","enum":["draft","open","closed","unpublished","cancelled","postponed","schedule"]},"in":"query","name":"status","required":false,"description":"Filter by status; omit to include all"},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Search events by name or address (case-insensitive partial match)"},{"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"in":"query","name":"startBefore","required":false,"description":"Only events starting on or before this date (ISO 8601). Example: 2025-06-01T00:00:00.000Z"},{"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"in":"query","name":"startAfter","required":false,"description":"Only events starting on or after this date (ISO 8601). Example: 2025-01-01T00:00:00.000Z"},{"schema":{"type":"string"},"in":"query","name":"sortField","required":false,"description":"Field to sort by (default: start)"},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false,"description":"Sort direction (default: desc)"},{"schema":{"type":"string"},"in":"query","name":"filters","required":false,"description":"JSON-encoded array of filter groups for advanced filtering.\nEach group has \"logic\" (\"and\" | \"or\") and \"conditions\" (array of conditions or nested groups).\nEach condition has \"field\", \"operator\", and optional \"value\".\nOperators by type:\n- Text: is_equal_to_any_of, is_not_equal_to_any_of, contains, contains_exactly\n- Date: is_before, is_after, is_between (value: {start, end})\n- Number: is_equal_to, is_not_equal_to, is_greater_than, is_greater_than_or_equal_to, is_less_than, is_less_than_or_equal_to, is_between\n- Select: is_any_of, is_none_of\n- Common: is_empty, is_not_empty\nExample: [{\"logic\":\"and\",\"conditions\":[{\"field\":\"status\",\"operator\":\"is_any_of\",\"value\":[\"open\",\"closed\"]},{\"field\":\"ticketSum\",\"operator\":\"is_greater_than\",\"value\":10}]}]"},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, name, type, schedule, start, end, multiDayStartTimes, multiDayEndTimes, status, itemsSold, revenueCents, minPriceCents, maxPriceCents, currency, timeZone, isPublic, isVirtual, location, locationPlaceholder, virtualEventLink, venueName, image, images, tags, customTags, isCancelled, createdAt, updatedAt. Omit for all fields."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","description":"'event', 'booking', 'recurring', or 'multiple'"},"description":{"description":"Event description as HTML. Only present when descriptionBlocks is empty.","type":"string"},"descriptionBlocks":{"description":"Rich content blocks for the event description. If present and non-empty, clients should render these instead of the description field.\nEach block has a type (text: HTML content, image: URL, video: YouTube URL) and content string.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","image","video"]},"content":{"type":"string"},"id":{"type":"number"}},"required":["type","content","id"],"additionalProperties":false}},"schedule":{"type":"string","enum":["Single date","Multiple dates"]},"start":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"For single-date events the start time; for multi-date the first time slot."},"end":{"description":"For single-date events the end time; for multi-date the last time slot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"multiDayStartTimes":{"description":"All start times for multi-day events","type":"array","items":{"type":"string"}},"multiDayEndTimes":{"description":"All end times for multi-day events","type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["draft","open","closed","unpublished","cancelled","postponed","schedule"],"description":"The status of an event.\n- draft: has not been published\n- open: published and ticket sales are open\n- closed: published, ticket sales are closed but the event will proceed as normal\n- unpublished: was previously published, but is no longer visible\n- cancelled: published, ticket sales closed, event is cancelled\n- postponed: published, ticket sales closed, event is postponed\n- schedule: not yet published, scheduled to be published in the future"},"itemsSold":{"type":"number","description":"Total tickets and products sold"},"revenueCents":{"type":"number","description":"Total event revenue, in cents"},"minPriceCents":{"description":"Minimum ticket/product price in cents. Does not contain fees.","type":"number","nullable":true},"maxPriceCents":{"description":"Maximum ticket/product price in cents. Does not contain fees.","type":"number","nullable":true},"currency":{"type":"string","description":"Currency code (e.g. USD, CAD)"},"timeZone":{"description":"IANA time zone (may be missing for pre-2024 events)","type":"string"},"isPublic":{"type":"boolean","description":"True if the event is public"},"isVirtual":{"type":"boolean","description":"True if the event is virtual"},"location":{"description":"Event location with address and coordinates","type":"object","properties":{"address":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"additionalProperties":false},"locationPlaceholder":{"description":"Placeholder text to link to location","type":"string"},"virtualEventLink":{"description":"Link for virtual access","type":"string"},"venueName":{"description":"Name of the associated seating-chart venue","type":"string"},"image":{"description":"URL of the event's main image","type":"string"},"images":{"description":"Gallery images","type":"array","items":{"type":"string"}},"tags":{"description":"Tag metadata","type":"array","items":{"type":"string"}},"customTags":{"description":"Custom tag overlays","type":"array","items":{"type":"string"}},"contentBlocks":{"description":"Structured content (FAQs, etc.)","type":"array","items":{"type":"object","additionalProperties":{}}},"language":{"description":"Event language (e.g. 'en', 'fr')","type":"string"},"isCancelled":{"description":"Cancellation flag","type":"boolean"},"redirectUrl":{"description":"Post-checkout URL","type":"string"},"customTerms":{"description":"Custom checkout conditions","type":"object","properties":{"hasCustomTerms":{"type":"boolean"},"type":{"type":"string","enum":["url","text"]},"url":{"type":"string"},"content":{"type":"string"}},"additionalProperties":false},"createdAt":{"description":"Creation timestamp","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"description":"Last update timestamp","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/events/balance":{"get":{"summary":"Get Payout Balance","tags":["Events"],"description":"Returns the payout balance (available / pending / instant, plus paid-out when scoped to an event), grouped by currency. Money is in cents.","parameters":[{"schema":{"type":"string"},"in":"query","name":"eventId","required":false,"description":"Scope the balance to one event; omit for account-wide"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"available_balance":{"type":"object","properties":{"balance":{"type":"number","description":"Net available to the host, in cents."},"net":{"type":"number","description":"Gross minus fees minus refunds, in cents."},"gross":{"type":"number","description":"Gross total, in cents."},"fees":{"type":"number","description":"Fees total, in cents."},"currency":{"description":"Currency code; null on an empty bucket.","type":"string","nullable":true},"orders":{"type":"array","items":{"type":"object","properties":{"_id":{},"gross":{"type":"number"},"fees":{"type":"number"},"threeCFee":{"type":"number"},"stripeFee":{"type":"number"},"refundedAmount":{"type":"number"},"latest_charge":{"type":"string"},"event_id":{"type":"string"}},"additionalProperties":{}}},"account_limit":{"type":"number"}},"required":["balance","net","gross","fees","currency","orders"],"additionalProperties":false},"pending_balance":{"type":"object","properties":{"balance":{"type":"number","description":"Net available to the host, in cents."},"net":{"type":"number","description":"Gross minus fees minus refunds, in cents."},"gross":{"type":"number","description":"Gross total, in cents."},"fees":{"type":"number","description":"Fees total, in cents."},"currency":{"description":"Currency code; null on an empty bucket.","type":"string","nullable":true},"orders":{"type":"array","items":{"type":"object","properties":{"_id":{},"gross":{"type":"number"},"fees":{"type":"number"},"threeCFee":{"type":"number"},"stripeFee":{"type":"number"},"refundedAmount":{"type":"number"},"latest_charge":{"type":"string"},"event_id":{"type":"string"}},"additionalProperties":{}}},"account_limit":{"type":"number"}},"required":["balance","net","gross","fees","currency","orders"],"additionalProperties":false},"instant_balance":{"type":"object","properties":{"balance":{"type":"number","description":"Net available to the host, in cents."},"net":{"type":"number","description":"Gross minus fees minus refunds, in cents."},"gross":{"type":"number","description":"Gross total, in cents."},"fees":{"type":"number","description":"Fees total, in cents."},"currency":{"description":"Currency code; null on an empty bucket.","type":"string","nullable":true},"orders":{"type":"array","items":{"type":"object","properties":{"_id":{},"gross":{"type":"number"},"fees":{"type":"number"},"threeCFee":{"type":"number"},"stripeFee":{"type":"number"},"refundedAmount":{"type":"number"},"latest_charge":{"type":"string"},"event_id":{"type":"string"}},"additionalProperties":{}}},"account_limit":{"type":"number"}},"required":["balance","net","gross","fees","currency","orders"],"additionalProperties":false},"paid_out_balance":{"description":"Only present when scoped to an event.","type":"object","properties":{"balance":{"type":"number","description":"Net available to the host, in cents."},"net":{"type":"number","description":"Gross minus fees minus refunds, in cents."},"gross":{"type":"number","description":"Gross total, in cents."},"fees":{"type":"number","description":"Fees total, in cents."},"currency":{"description":"Currency code; null on an empty bucket.","type":"string","nullable":true},"orders":{"type":"array","items":{"type":"object","properties":{"_id":{},"gross":{"type":"number"},"fees":{"type":"number"},"threeCFee":{"type":"number"},"stripeFee":{"type":"number"},"refundedAmount":{"type":"number"},"latest_charge":{"type":"string"},"event_id":{"type":"string"}},"additionalProperties":{}}},"account_limit":{"type":"number"}},"required":["balance","net","gross","fees","currency","orders"],"additionalProperties":false},"currency":{"type":"string","nullable":true}},"required":["available_balance","pending_balance","instant_balance","currency"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/events/{id}":{"get":{"summary":"Get Event","tags":["Events"],"description":"Retrieves detailed information about a single event by ID.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, name, type, description, descriptionBlocks, schedule, start, end, multiDayStartTimes, multiDayEndTimes, status, itemsSold, revenueCents, minPriceCents, maxPriceCents, currency, timeZone, isPublic, isVirtual, location, locationPlaceholder, virtualEventLink, venueName, image, images, tags, customTags, contentBlocks, language, isCancelled, redirectUrl, customTerms, createdAt, updatedAt. Omit for all fields."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Event ID, discoverable via list_events"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","description":"'event', 'booking', 'recurring', or 'multiple'"},"description":{"description":"Event description as HTML. Only present when descriptionBlocks is empty.","type":"string"},"descriptionBlocks":{"description":"Rich content blocks for the event description. If present and non-empty, clients should render these instead of the description field.\nEach block has a type (text: HTML content, image: URL, video: YouTube URL) and content string.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","image","video"]},"content":{"type":"string"},"id":{"type":"number"}},"required":["type","content","id"],"additionalProperties":false}},"schedule":{"type":"string","enum":["Single date","Multiple dates"]},"start":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"For single-date events the start time; for multi-date the first time slot."},"end":{"description":"For single-date events the end time; for multi-date the last time slot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"multiDayStartTimes":{"description":"All start times for multi-day events","type":"array","items":{"type":"string"}},"multiDayEndTimes":{"description":"All end times for multi-day events","type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["draft","open","closed","unpublished","cancelled","postponed","schedule"],"description":"The status of an event.\n- draft: has not been published\n- open: published and ticket sales are open\n- closed: published, ticket sales are closed but the event will proceed as normal\n- unpublished: was previously published, but is no longer visible\n- cancelled: published, ticket sales closed, event is cancelled\n- postponed: published, ticket sales closed, event is postponed\n- schedule: not yet published, scheduled to be published in the future"},"itemsSold":{"type":"number","description":"Total tickets and products sold"},"revenueCents":{"type":"number","description":"Total event revenue, in cents"},"minPriceCents":{"description":"Minimum ticket/product price in cents. Does not contain fees.","type":"number","nullable":true},"maxPriceCents":{"description":"Maximum ticket/product price in cents. Does not contain fees.","type":"number","nullable":true},"currency":{"type":"string","description":"Currency code (e.g. USD, CAD)"},"timeZone":{"description":"IANA time zone (may be missing for pre-2024 events)","type":"string"},"isPublic":{"type":"boolean","description":"True if the event is public"},"isVirtual":{"type":"boolean","description":"True if the event is virtual"},"location":{"description":"Event location with address and coordinates","type":"object","properties":{"address":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"additionalProperties":false},"locationPlaceholder":{"description":"Placeholder text to link to location","type":"string"},"virtualEventLink":{"description":"Link for virtual access","type":"string"},"venueName":{"description":"Name of the associated seating-chart venue","type":"string"},"image":{"description":"URL of the event's main image","type":"string"},"images":{"description":"Gallery images","type":"array","items":{"type":"string"}},"tags":{"description":"Tag metadata","type":"array","items":{"type":"string"}},"customTags":{"description":"Custom tag overlays","type":"array","items":{"type":"string"}},"contentBlocks":{"description":"Structured content (FAQs, etc.)","type":"array","items":{"type":"object","additionalProperties":{}}},"language":{"description":"Event language (e.g. 'en', 'fr')","type":"string"},"isCancelled":{"description":"Cancellation flag","type":"boolean"},"redirectUrl":{"description":"Post-checkout URL","type":"string"},"customTerms":{"description":"Custom checkout conditions","type":"object","properties":{"hasCustomTerms":{"type":"boolean"},"type":{"type":"string","enum":["url","text"]},"url":{"type":"string"},"content":{"type":"string"}},"additionalProperties":false},"createdAt":{"description":"Creation timestamp","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"description":"Last update timestamp","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Event","tags":["Events"],"description":"Updates an event's basic fields. Only provided fields are changed. Does not update products, tickets, or order forms.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"Event name","type":"string"},"description":{"description":"Event description (HTML supported)","type":"string"},"descriptionBlocks":{"description":"Rich content blocks for the event description","type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","image","video"]},"content":{"type":"string"},"id":{"type":"number"}},"required":["type","content","id"]}},"status":{"description":"Event status (e.g. draft, open, closed, cancelled)","type":"string","enum":["draft","open","closed","unpublished","cancelled","postponed","schedule"]},"start":{"description":"Start date/time in UTC","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"end":{"description":"End date/time in UTC","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"hasEndDate":{"description":"Whether the event has a specified end time","type":"boolean"},"privacy":{"description":"Public events appear on discover; private are link-only","type":"string","enum":["public","private"]},"eventType":{"description":"Virtual or in-person","type":"string","enum":["virtual","inperson"]},"virtualEventLink":{"description":"Link to virtual event","type":"string"},"address":{"description":"Event location address","type":"string"},"locationPlaceholder":{"description":"Placeholder text when no address is set","type":"string"},"timeZone":{"description":"IANA time zone (e.g. \"America/New_York\")","type":"string"},"collectEmails":{"description":"Enable checkout; if false customers cannot order","type":"boolean"},"redirectUrl":{"description":"URL to redirect to after checkout","type":"string"},"customTerms":{"description":"Custom terms and conditions","type":"object","properties":{"hasCustomTerms":{"type":"boolean"},"type":{"type":"string","enum":["url","text"]},"url":{"type":"string"},"content":{"type":"string"}},"required":["hasCustomTerms","type","url","content"]},"customTags":{"description":"Custom tag overlays","type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Event ID, discoverable via list_events"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","description":"'event', 'booking', 'recurring', or 'multiple'"},"description":{"description":"Event description as HTML. Only present when descriptionBlocks is empty.","type":"string"},"descriptionBlocks":{"description":"Rich content blocks for the event description. If present and non-empty, clients should render these instead of the description field.\nEach block has a type (text: HTML content, image: URL, video: YouTube URL) and content string.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","image","video"]},"content":{"type":"string"},"id":{"type":"number"}},"required":["type","content","id"],"additionalProperties":false}},"schedule":{"type":"string","enum":["Single date","Multiple dates"]},"start":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"For single-date events the start time; for multi-date the first time slot."},"end":{"description":"For single-date events the end time; for multi-date the last time slot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"multiDayStartTimes":{"description":"All start times for multi-day events","type":"array","items":{"type":"string"}},"multiDayEndTimes":{"description":"All end times for multi-day events","type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["draft","open","closed","unpublished","cancelled","postponed","schedule"],"description":"The status of an event.\n- draft: has not been published\n- open: published and ticket sales are open\n- closed: published, ticket sales are closed but the event will proceed as normal\n- unpublished: was previously published, but is no longer visible\n- cancelled: published, ticket sales closed, event is cancelled\n- postponed: published, ticket sales closed, event is postponed\n- schedule: not yet published, scheduled to be published in the future"},"itemsSold":{"type":"number","description":"Total tickets and products sold"},"revenueCents":{"type":"number","description":"Total event revenue, in cents"},"minPriceCents":{"description":"Minimum ticket/product price in cents. Does not contain fees.","type":"number","nullable":true},"maxPriceCents":{"description":"Maximum ticket/product price in cents. Does not contain fees.","type":"number","nullable":true},"currency":{"type":"string","description":"Currency code (e.g. USD, CAD)"},"timeZone":{"description":"IANA time zone (may be missing for pre-2024 events)","type":"string"},"isPublic":{"type":"boolean","description":"True if the event is public"},"isVirtual":{"type":"boolean","description":"True if the event is virtual"},"location":{"description":"Event location with address and coordinates","type":"object","properties":{"address":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"additionalProperties":false},"locationPlaceholder":{"description":"Placeholder text to link to location","type":"string"},"virtualEventLink":{"description":"Link for virtual access","type":"string"},"venueName":{"description":"Name of the associated seating-chart venue","type":"string"},"image":{"description":"URL of the event's main image","type":"string"},"images":{"description":"Gallery images","type":"array","items":{"type":"string"}},"tags":{"description":"Tag metadata","type":"array","items":{"type":"string"}},"customTags":{"description":"Custom tag overlays","type":"array","items":{"type":"string"}},"contentBlocks":{"description":"Structured content (FAQs, etc.)","type":"array","items":{"type":"object","additionalProperties":{}}},"language":{"description":"Event language (e.g. 'en', 'fr')","type":"string"},"isCancelled":{"description":"Cancellation flag","type":"boolean"},"redirectUrl":{"description":"Post-checkout URL","type":"string"},"customTerms":{"description":"Custom checkout conditions","type":"object","properties":{"hasCustomTerms":{"type":"boolean"},"type":{"type":"string","enum":["url","text"]},"url":{"type":"string"},"content":{"type":"string"}},"additionalProperties":false},"createdAt":{"description":"Creation timestamp","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"description":"Last update timestamp","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/events/{id}/ticket-counts":{"get":{"summary":"Get Event Ticket Counts","tags":["Tickets"],"description":"Returns check-in view counts (all / checked-in / awaiting) for an event, optionally scoped to a timeslot.","parameters":[{"schema":{"type":"string"},"in":"query","name":"timeslotId","required":false,"description":"Scope the counts to one timeslot"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Event ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"all":{"type":"number","description":"Active, paid, non-refunded tickets"},"checked_in":{"type":"number"},"awaiting_check_in":{"type":"number"}},"required":["all","checked_in","awaiting_check_in"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/events/{id}/tickets":{"get":{"summary":"List Event Tickets","tags":["Tickets"],"description":"Paginated per-ticket summary for an event's check-in table: attendee name /\nemail (collapsed from form answers), seat, promo codes, custom properties,\nand event location. Supports a case-insensitive name/email search and a\ntimeslot filter.","parameters":[{"schema":{"type":"string"},"in":"query","name":"timeslotId","required":false,"description":"Scope to one timeslot"},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Case-insensitive name/email search"},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false,"description":"Page number (0-based)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":500},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 500)"},{"schema":{"type":"string"},"in":"query","name":"sortField","required":false,"description":"Field to sort by (default _id)"},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false,"description":"Sort direction (default asc)"},{"schema":{"type":"string"},"in":"query","name":"filters","required":false,"description":"JSON-encoded advanced filter groups (the filter-builder wire shape)"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Event ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"item_name":{"type":"string"},"date":{"description":"Ticket / event date (ISO 8601)","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"checked_in":{"type":"boolean"},"boxOfficeId":{"type":"string"},"isBoxOffice":{"type":"boolean"},"eventId":{"type":"string"},"timeslot_id":{"type":"string"},"refunded":{"type":"boolean"},"seatingInformation":{"type":"object","properties":{"section":{"anyOf":[{"type":"string"},{"type":"number"}]},"sectionId":{"anyOf":[{"type":"string"},{"type":"number"}]},"row":{"anyOf":[{"type":"string"},{"type":"number"}]},"seat":{"anyOf":[{"type":"string"},{"type":"number"}]}},"additionalProperties":{}},"promoCodes":{"type":"array","items":{"type":"string"}},"eventLocation":{"type":"string"}},"required":["id","firstName","lastName","email","item_name","promoCodes"],"additionalProperties":{}}},"hasMore":{"type":"boolean"},"pageNumber":{"type":"number"},"pageSize":{"type":"number"}},"required":["data","hasMore","pageNumber","pageSize"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/features/":{"get":{"summary":"List Features","tags":["Features"],"description":"Lists the host's feature catalog. Filterable by type or active status.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string","enum":["boolean","quantity","enum","duration"]},"in":"query","name":"type","required":false,"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},{"schema":{"type":"boolean"},"in":"query","name":"active","required":false},{"schema":{"type":"string"},"in":"query","name":"fields","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"key":{"type":"string","description":"Application-facing identifier; unique per host"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"enumValues":{"description":"Required for type=enum; ordered low→high","type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Feature","tags":["Features"],"description":"Creates a Feature in the catalog. The `key` is the stable application-facing identifier (e.g. 'custom_domain', 'workflows'); `type` decides how Prices grant the feature and how it resolves.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"Application-facing identifier; lowercase, alphanumeric + underscore (e.g. 'custom_domain')"},"name":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"description":{"type":"string"},"enumValues":{"description":"Required when type='enum'. Ordered low→high tier","type":"array","items":{"type":"string"}},"metadata":{"type":"object","additionalProperties":{"type":"string"}}},"required":["key","name","type"]}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"key":{"type":"string","description":"Application-facing identifier; unique per host"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"enumValues":{"description":"Required for type=enum; ordered low→high","type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/features/resolve":{"get":{"summary":"Resolve Feature for Customer","tags":["Features"],"description":"Resolves the current value of a feature for a customer by walking active subscriptions → prices → feature grants. Returns the type-specific value plus the contributing subscription ids. For quantity features, also includes the live Entitlement balance.","parameters":[{"schema":{"type":"string"},"in":"query","name":"contactId","required":true,"description":"CRM contact id"},{"schema":{"type":"string"},"in":"query","name":"featureKey","required":true,"description":"Feature catalog key"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"feature":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"key":{"type":"string","description":"Application-facing identifier; unique per host"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"enumValues":{"description":"Required for type=enum; ordered low→high","type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","hostId","key","name","type","active","createdAt","updatedAt"],"additionalProperties":false},"value":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["type","enabled"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":0,"maximum":9007199254740991,"nullable":true},"balance":{"description":"Current Entitlement balance, if a ledger record exists","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["type","quantity"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string","nullable":true}},"required":["type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["duration"]},"durationDays":{"type":"integer","minimum":0,"maximum":9007199254740991,"nullable":true}},"required":["type","durationDays"],"additionalProperties":false}]},"contributingSubscriptionIds":{"type":"array","items":{"type":"string"}}},"required":["feature","value","contributingSubscriptionIds"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/features/{id}":{"get":{"summary":"Get Feature","tags":["Features"],"description":"Retrieves a single Feature by id.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fields","required":false},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Feature id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"key":{"type":"string","description":"Application-facing identifier; unique per host"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"enumValues":{"description":"Required for type=enum; ordered low→high","type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Feature","tags":["Features"],"description":"Applies a partial update. Mutable: name, description, enumValues, metadata. Immutable: key, type — to switch type, archive and create a new Feature.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string","nullable":true},"enumValues":{"description":"Replaces the list. Only meaningful for type='enum'","type":"array","items":{"type":"string"}},"metadata":{"type":"object","additionalProperties":{"type":"string"},"nullable":true}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Feature id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"key":{"type":"string","description":"Application-facing identifier; unique per host"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"enumValues":{"description":"Required for type=enum; ordered low→high","type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/features/{id}/archive":{"post":{"summary":"Archive Feature","tags":["Features"],"description":"Soft-archives a Feature. Idempotent. Existing Price grants continue resolving; new Prices cannot reference the archived feature.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Feature id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"key":{"type":"string","description":"Application-facing identifier; unique per host"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"enumValues":{"description":"Required for type=enum; ordered low→high","type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/features/{id}/unarchive":{"post":{"summary":"Unarchive Feature","tags":["Features"],"description":"Restores an archived Feature.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Feature id"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"key":{"type":"string","description":"Application-facing identifier; unique per host"},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["boolean","quantity","enum","duration"],"description":"Feature value shape.\n- boolean: pure on/off\n- quantity: countable (drives Entitlement balance)\n- enum: one of a fixed ordered set of values\n- duration: number of days (or unlimited)"},"enumValues":{"description":"Required for type=enum; ordered low→high","type":"array","items":{"type":"string"}},"active":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/":{"get":{"summary":"List Forms","tags":["Forms"],"description":"Fetch a list of forms belonging to the user. Each entry contains basic\ninformation about the form such as ID, name, and status.\nThe returned results are paginated.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":50,"type":"integer","minimum":1,"maximum":250},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string","enum":["standalone","order"]},"in":"query","name":"type","required":false,"description":"If specified, only forms of the given type are fetched.\nOtherwise, all forms are fetched."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"hasMore":{"type":"boolean","description":"If true, there are more pages of results available."},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"numElements":{"type":"number","description":"The number of questions and static elements in the form."},"type":{"type":"string","enum":["standalone","order"],"description":"The type of form, determines whether the form is used for event checkout flows (\"order\") or as a standalone form (\"standalone\")."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"}},"required":["id","name","numElements","type","status"],"additionalProperties":false,"description":"A compact summary of a form."}}},"required":["hasMore","data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Form","tags":["Forms"],"description":"Create a new, empty form with no elements. The `isEventForm` flag may\nonly be set at creation time and cannot be changed afterwards, because\nconverting between standalone and event forms is a destructive operation\nthat affects element layout and attendee configuration.\nReturns the full form document.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["standalone","order"],"description":"Whether this form is to be used for orders, or standalone. This flag may\nonly be set at creation time and cannot be changed later."}},"required":["name","type"],"description":"Subset of form fields which can be set when creating a form. Elements and\nlayout are not included because they are managed by other tools."}}},"description":"Subset of form fields which can be set when creating a form. Elements and\nlayout are not included because they are managed by other tools."},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["standalone"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements"],"additionalProperties":false,"description":"A standalone form (not associated with an event). For example, one might email\na link to a standalone form to their contacts as a survey.\nStandalone forms can only populate CRM properties on contacts.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."},{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["order"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"},"attendeeRowsStart":{"type":"number","description":"The index of the first row in the form's `rows` array which is in the\n\"ticket-holder\" section."}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements","attendeeRowsStart"],"additionalProperties":false,"description":"An order form is a form presented to customers when purchasing tickets or\nother products from a host, as part of the checkout flow.\nOrder forms have two sections: a \"buyer\" section whose elements appear once\nfor the whole order, and a \"ticket-holder\"/\"attendees\" section whose elements\nappear once for each ticket in the order, to collect multiple responses when\nan order represents multiple event attendees.\nOrder forms can populate CRM properties on contacts, orders, and tickets.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}":{"get":{"summary":"Get Form","tags":["Forms"],"description":"Fetch a form by ID. Returns the full form document, including all elements,\nlayout, and conditional logic configuration.","parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["standalone"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements"],"additionalProperties":false,"description":"A standalone form (not associated with an event). For example, one might email\na link to a standalone form to their contacts as a survey.\nStandalone forms can only populate CRM properties on contacts.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."},{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["order"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"},"attendeeRowsStart":{"type":"number","description":"The index of the first row in the form's `rows` array which is in the\n\"ticket-holder\" section."}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements","attendeeRowsStart"],"additionalProperties":false,"description":"An order form is a form presented to customers when purchasing tickets or\nother products from a host, as part of the checkout flow.\nOrder forms have two sections: a \"buyer\" section whose elements appear once\nfor the whole order, and a \"ticket-holder\"/\"attendees\" section whose elements\nappear once for each ticket in the order, to collect multiple responses when\nan order represents multiple event attendees.\nOrder forms can populate CRM properties on contacts, orders, and tickets.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."}]}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Edit Form Settings","tags":["Forms"],"description":"Update form-level settings such as name, status, and submit button\nproperties. Only the fields provided will be overwritten; omitted fields\nare left unchanged. The `isEventForm` flag cannot be modified after\ncreation. To modify elements or layout, use the element-specific tools.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean","nullable":true},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"],"nullable":true}},"description":"Subset of form fields which can be edited after creation. Excludes `type`\n(immutable after creation), as well as elements and layout (which are managed\nby other tools).\nSetting a field to null will remove it from the form, omitting a field will\nleave it unchanged."}}},"description":"Subset of form fields which can be edited after creation. Excludes `type`\n(immutable after creation), as well as elements and layout (which are managed\nby other tools).\nSetting a field to null will remove it from the form, omitting a field will\nleave it unchanged."},"parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["standalone"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements"],"additionalProperties":false,"description":"A standalone form (not associated with an event). For example, one might email\na link to a standalone form to their contacts as a survey.\nStandalone forms can only populate CRM properties on contacts.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."},{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["order"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"},"attendeeRowsStart":{"type":"number","description":"The index of the first row in the form's `rows` array which is in the\n\"ticket-holder\" section."}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements","attendeeRowsStart"],"additionalProperties":false,"description":"An order form is a form presented to customers when purchasing tickets or\nother products from a host, as part of the checkout flow.\nOrder forms have two sections: a \"buyer\" section whose elements appear once\nfor the whole order, and a \"ticket-holder\"/\"attendees\" section whose elements\nappear once for each ticket in the order, to collect multiple responses when\nan order represents multiple event attendees.\nOrder forms can populate CRM properties on contacts, orders, and tickets.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}/duplicate":{"post":{"summary":"Duplicate Form","tags":["Forms"],"description":"Create a copy of an existing form, including all of its elements, layout,\nand conditional logic. By default, the copy's name is prefixed with \"[Copy]\"\nand its status is set to \"draft\". Both can be overridden.\nReturns the full duplicated form document.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"\n    If specified, the duplicated form will have the given name. Otherwise, a\n    default name will be generated by prefixing the existing name with \"[Copy]\".\n  ","type":"string"},"status":{"description":"If specified, the new form will have the given status.\nOtherwise, the new form will be a draft by default.","type":"string","enum":["draft","active","archived"]}},"nullable":true}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["standalone"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements"],"additionalProperties":false,"description":"A standalone form (not associated with an event). For example, one might email\na link to a standalone form to their contacts as a survey.\nStandalone forms can only populate CRM properties on contacts.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."},{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["order"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"},"attendeeRowsStart":{"type":"number","description":"The index of the first row in the form's `rows` array which is in the\n\"ticket-holder\" section."}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements","attendeeRowsStart"],"additionalProperties":false,"description":"An order form is a form presented to customers when purchasing tickets or\nother products from a host, as part of the checkout flow.\nOrder forms have two sections: a \"buyer\" section whose elements appear once\nfor the whole order, and a \"ticket-holder\"/\"attendees\" section whose elements\nappear once for each ticket in the order, to collect multiple responses when\nan order represents multiple event attendees.\nOrder forms can populate CRM properties on contacts, orders, and tickets.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}/elements":{"post":{"summary":"Add Form Element","tags":["Forms"],"description":"Add a new element to a form. For order forms, the element is appended to the\nbuyer section. Otherwise, it is appended to the end of the form.\nA layout row for the element is created automatically, and the form is saved\nafter the element is added. The new element is returned.","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"]}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"]},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"]}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"]},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"]}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"]},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"]}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]}},"required":["prompt","type","required"],"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]}},"required":["prompt","type","required","accept"],"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"description":"A non-interactive image block for displaying visual content"}]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"anyOf":[{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}/elements/{elementId}":{"patch":{"summary":"Edit Form Element","tags":["Forms"],"description":"Update one or more fields on an existing element. Only the fields provided\nwill be overwritten; omitted fields are left unchanged. The element's\n`type` cannot be changed. This tool can also set `forEventItems` to\ncontrol checkout-based visibility on order forms. To move an element between\nthe buyer and attendee sections, use `move_form_element` instead.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"anyOf":[{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},{"nullable":true,"enum":[null]}],"description":"If true, the element's prompt will not be shown to respondents."},"helperText":{"anyOf":[{"description":"Optional subtle helper text to display below the element.","type":"string"},{"nullable":true,"enum":[null]}],"description":"Optional subtle helper text to display below the element."},"placeholder":{"anyOf":[{"description":"Only for questions with text inputs or drop-down lists, this is the placeholder shown when the input is empty","type":"string"},{"nullable":true,"enum":[null]}],"description":"Only for questions with text inputs or drop-down lists, this is the placeholder shown when the input is empty"},"required":{"anyOf":[{"description":"For all non-static questions except 'Select Multiple' and 'Select Multiple with \"Other\"',\nthis is true if the question is required to submit the form.","type":"boolean"},{"nullable":true,"enum":[null]}],"description":"For all non-static questions except 'Select Multiple' and 'Select Multiple with \"Other\"',\nthis is true if the question is required to submit the form."},"propertyId":{"anyOf":[{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nFor multiple-choice questions, the custom property also provides the\nselectable options, and exactly one of `propertyId` or `options` must be\nspecified.","type":"string"},{"nullable":true,"enum":[null]}],"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nFor multiple-choice questions, the custom property also provides the\nselectable options, and exactly one of `propertyId` or `options` must be\nspecified."},"contactField":{"type":"string","enum":["email","phone","firstName","lastName","status"],"description":"Allows applicable questions to automatically populate customer information in the CRM.\n- email: can only be used on \"Email\" questions\n- phone: can only be used on \"Phone\" questions\n- firstName, lastName: can only be used on \"Text\" questions\n- status: can only be used on \"Yes/No\" questions","nullable":true},"options":{"anyOf":[{"description":"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.","type":"array","items":{"type":"string"}},{"nullable":true,"enum":[null]}],"description":"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."},"dropdown":{"anyOf":[{"description":"Only for 'Select One' questions (**not** including 'Select One or \"Other\"'),\nif this is true, the question will be shown as a dropdown list. Otherwise,\nit will be shown as a group of radio buttons.","type":"boolean"},{"nullable":true,"enum":[null]}],"description":"Only for 'Select One' questions (**not** including 'Select One or \"Other\"'),\nif this is true, the question will be shown as a dropdown list. Otherwise,\nit will be shown as a group of radio buttons."},"yesRequired":{"anyOf":[{"description":"Only for 'Yes/No' questions. If true, respondents must answer \"Yes\" to this\nquestion to submit their response.","type":"boolean"},{"nullable":true,"enum":[null]}],"description":"Only for 'Yes/No' questions. If true, respondents must answer \"Yes\" to this\nquestion to submit their response."},"otherPrompt":{"anyOf":[{"description":"Only allowed (and required) for 'Select One or \"Other\"' and 'Select Multiple with \"Other\"'\nquestions, this is the label used for the \"other\" option's radio/checkbox.","type":"string"},{"nullable":true,"enum":[null]}],"description":"Only allowed (and required) for 'Select One or \"Other\"' and 'Select Multiple with \"Other\"'\nquestions, this is the label used for the \"other\" option's radio/checkbox."},"minChoices":{"anyOf":[{"description":"Required for 'Select Multiple' and 'Select Multiple with \"Other\"'. The\nminimum number of choices that must be selected (set to 0 to make the\nquestion optional).","type":"number"},{"nullable":true,"enum":[null]}],"description":"Required for 'Select Multiple' and 'Select Multiple with \"Other\"'. The\nminimum number of choices that must be selected (set to 0 to make the\nquestion optional)."},"maxChoices":{"anyOf":[{"description":"For 'Select Multiple' and 'Select Multiple with \"Other\"', this is an\noptional maximum number of choices that can be selected.","type":"number"},{"nullable":true,"enum":[null]}],"description":"For 'Select Multiple' and 'Select Multiple with \"Other\"', this is an\noptional maximum number of choices that can be selected."},"min":{"anyOf":[{"description":"For 'Date' questions, the optional minimum allowed date,\nas a string in YYYY-MM-DD format.","type":"string"},{"nullable":true,"enum":[null]}],"description":"For 'Date' questions, the optional minimum allowed date,\nas a string in YYYY-MM-DD format."},"max":{"anyOf":[{"description":"For 'Date' questions, the optional maximum allowed date,\nas a string in YYYY-MM-DD format.","type":"string"},{"nullable":true,"enum":[null]}],"description":"For 'Date' questions, the optional maximum allowed date,\nas a string in YYYY-MM-DD format."},"minValue":{"anyOf":[{"description":"For 'Number' questions, the optional smallest value the respondent may enter.","type":"number"},{"nullable":true,"enum":[null]}],"description":"For 'Number' questions, the optional smallest value the respondent may enter."},"maxValue":{"anyOf":[{"description":"For 'Number' questions, the optional largest value the respondent may enter.","type":"number"},{"nullable":true,"enum":[null]}],"description":"For 'Number' questions, the optional largest value the respondent may enter."},"integerOnly":{"anyOf":[{"description":"For 'Number' questions, if true only whole numbers are accepted (no decimals).","type":"boolean"},{"nullable":true,"enum":[null]}],"description":"For 'Number' questions, if true only whole numbers are accepted (no decimals)."},"accept":{"anyOf":[{"description":"For 'File' questions, determines the types of file that are allowed to be\nuploaded for the question. This array must be present and contain at least\none element for 'File' questions.","type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]}},{"nullable":true,"enum":[null]}],"description":"For 'File' questions, determines the types of file that are allowed to be\nuploaded for the question. This array must be present and contain at least\none element for 'File' questions."},"logicGroups":{"anyOf":[{"description":"Allows questions with fixed options (select one/multiple, yes/no) to\nconditionally reveal other questions in the form. Any question referenced by\na conditional logic group will be hidden until one of the groups referencing\nit is satisfied.","type":"array","items":{"anyOf":[{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."},{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}]}},{"nullable":true,"enum":[null]}],"description":"Allows questions with fixed options (select one/multiple, yes/no) to\nconditionally reveal other questions in the form. Any question referenced by\na conditional logic group will be hidden until one of the groups referencing\nit is satisfied."},"content":{"anyOf":[{"description":"For 'Static Text' elements, this is the content displayed in the text block.\nRequired for 'Static Text' elements.","type":"string"},{"nullable":true,"enum":[null]}],"description":"For 'Static Text' elements, this is the content displayed in the text block.\nRequired for 'Static Text' elements."},"imageUrl":{"anyOf":[{"description":"For 'Static Image' elements, this is the URL of the image to display.\nRequired for 'Static Image' elements.","type":"string"},{"nullable":true,"enum":[null]}],"description":"For 'Static Image' elements, this is the URL of the image to display.\nRequired for 'Static Image' elements."},"imageWidth":{"anyOf":[{"description":"For 'Static Image' elements, this is the width as a percentage of of the\ncontaining element (the column in the form's layout). Defaults to 100.","type":"number"},{"nullable":true,"enum":[null]}],"description":"For 'Static Image' elements, this is the width as a percentage of of the\ncontaining element (the column in the form's layout). Defaults to 100."},"forEventItems":{"anyOf":[{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"]},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"]},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"]}]}},{"nullable":true,"enum":[null]}],"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default."}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true,"description":"The ID of the element."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"anyOf":[{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Form Element","tags":["Forms"],"description":"Remove an element from a form. The element's layout row is also removed,\nand any conditional logic groups referencing the deleted element are\ncleaned up. This operation cannot be undone.","parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true,"description":"The ID of the element."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deletedElementId":{"type":"string"}},"required":["deletedElementId"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}/elements/{elementId}/position":{"put":{"summary":"Move Form Element","tags":["Forms"],"description":"Move an element to a different position in the form's layout. The\n`position` is a 0-based row index in the form's `rows` array.\nFor order forms, the `section` parameter moves an element between the\nbuyer and ticket-holder sections, which updates `askAllAttendees` and\nadjusts `attendeeRowsStart` automatically. If `section` is omitted on an\norder form, the element stays in its current section. The parameter is\nignored for standalone forms.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"position":{"type":"number","description":"The target row index (0-based) in the form's `rows` array."},"section":{"description":"For order forms only. Moves the element to the specified section, updating\n`askAllAttendees` accordingly.","type":"string","enum":["buyer","ticket-holder"]}},"required":["position"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true,"description":"The ID of the element."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["standalone"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements"],"additionalProperties":false,"description":"A standalone form (not associated with an event). For example, one might email\na link to a standalone form to their contacts as a survey.\nStandalone forms can only populate CRM properties on contacts.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."},{"type":"object","properties":{"id":{"type":"string","description":"The form's ID."},"name":{"type":"string","description":"The form's display name."},"nameHidden":{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},"ownerId":{"type":"string","description":"The ID of the host who owns this form."},"status":{"type":"string","enum":["draft","active","archived"],"description":"Determines the status of the form.\n- draft: the form cannot be accessed directly at its URL, and may not show up to the organizer in tables by default\n- active: the form can be accessed by its URL, and appears to the organizer in all tables\n- archived: for all intents and purposes, the form is deleted, but can still be accessed and restored in the forms dashboard"},"rows":{"type":"array","items":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"elementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is\ndisplayed in this column."},"widthFraction":{"type":"number","description":"A value between 0 and 1 that determines the width of this column in the row.\nThe sum of all `widthFraction` values in a row always sums to 1."}},"required":["elementIndex","widthFraction"],"additionalProperties":false},"description":"Determines which elements are displayed in the row, and how much of the\nrow's total width each element occupies."}},"required":["columns"],"additionalProperties":false},"description":"A form's layout consists of rows, each with one or more columns. Each column\ncontains a single form element. Form layouts determine the order that the\nform's elements are displayed in, not the order of the form's `elements`\narray."},"submitButtonText":{"type":"string","description":"Text displayed in the form's submission button. Typically, \"Submit\" is the default."},"submitButtonWidth":{"type":"string","enum":["auto","fill"],"description":"Whether the form's submission button should shrink to fit its label (\"auto\"), or fill its container (\"fill\")."},"submitButtonAlign":{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},"type":{"type":"string","enum":["order"]},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]},"description":"Form questions (input fields) or static elements (text blocks, images, etc.)"},"attendeeRowsStart":{"type":"number","description":"The index of the first row in the form's `rows` array which is in the\n\"ticket-holder\" section."}},"required":["id","name","ownerId","status","rows","submitButtonText","submitButtonWidth","type","elements","attendeeRowsStart"],"additionalProperties":false,"description":"An order form is a form presented to customers when purchasing tickets or\nother products from a host, as part of the checkout flow.\nOrder forms have two sections: a \"buyer\" section whose elements appear once\nfor the whole order, and a \"ticket-holder\"/\"attendees\" section whose elements\nappear once for each ticket in the order, to collect multiple responses when\nan order represents multiple event attendees.\nOrder forms can populate CRM properties on contacts, orders, and tickets.\nForm submissions can trigger workflows, and their questions & answers can be\nreferenced in workflow actions."}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}/elements/{elementId}/other-option":{"put":{"summary":"Toggle Form \"Other\" Option (enable)","tags":["Forms"],"description":"Enable or disable the freeform \"Other\" option on a selection question.\nThis is the only operation that changes an element's type:\n- 'Select One' <-> 'Select One or \"Other\"'\n- 'Select Multiple' <-> 'Select Multiple with \"Other\"'\nWhen enabling, an `otherPrompt` label must be provided. When disabling,\nthe existing `otherPrompt` is removed. Fails if the specified element is\nnot a selection question.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"otherPrompt":{"type":"string","description":"The label for the \"Other\" option."}},"required":["otherPrompt"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true,"description":"The ID of the element."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"anyOf":[{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Toggle Form \"Other\" Option (disable)","tags":["Forms"],"description":"Enable or disable the freeform \"Other\" option on a selection question.\nThis is the only operation that changes an element's type:\n- 'Select One' <-> 'Select One or \"Other\"'\n- 'Select Multiple' <-> 'Select Multiple with \"Other\"'\nWhen enabling, an `otherPrompt` label must be provided. When disabling,\nthe existing `otherPrompt` is removed. Fails if the specified element is\nnot a selection question.","parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true,"description":"The ID of the element."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"anyOf":[{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}/elements/{elementId}/logic-rules":{"post":{"summary":"Add Form Logic Rule","tags":["Forms"],"description":"Add a conditional logic rule to an element. When the source element's\nanswer matches the condition, the target element is revealed. The source\nelement must be a selection type (Select One, Select Multiple, or their\n\"Other\" variants) or a Yes/No question.\nFor order forms, attendee-section elements cannot reveal buyer-section\nelements.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revealedElementId":{"type":"string","description":"The target element to show when the condition is met."},"condition":{"anyOf":[{"type":"object","properties":{"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["optionIndices","operator"],"description":"For selection questions. Reveals the target element when the selected\noptions satisfy the operator."},{"type":"object","properties":{"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["selectionType","value"],"description":"For Yes/No questions. Reveals the target element based on the answer value."}]}},"required":["revealedElementId","condition"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true,"description":"The ID of the element."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"anyOf":[{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/forms/{formId}/elements/{elementId}/logic-rules/{targetElementId}":{"delete":{"summary":"Remove Form Logic Rule","tags":["Forms"],"description":"Remove all conditional logic rules on a source element which target a\nspecific revealed element. If the source element has no remaining logic\nrules after removal, its `logicGroups` array is removed entirely.","parameters":[{"schema":{"type":"string"},"in":"path","name":"formId","required":true,"description":"The ID of the form."},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true,"description":"The source element that owns the rules."},{"schema":{"type":"string"},"in":"path","name":"targetElementId","required":true,"description":"The revealed element whose rules should be removed."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"anyOf":[{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform single-line text input."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A freeform multi-line text area."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A numeric input that accepts whole numbers or decimals."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A single-choice question rendered as radio buttons or a dropdown."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","required","otherPrompt"],"additionalProperties":false,"description":"A single-choice question with a freeform \"Other\" option, rendered as radio buttons."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices"],"additionalProperties":false,"description":"A multi-select question rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}}},"required":["prompt","type","minChoices","otherPrompt"],"additionalProperties":false,"description":"A multi-select question with a freeform \"Other\" option, rendered as checkboxes"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"}},"required":["prompt","type","required","dropdown"],"additionalProperties":false,"description":"A dropdown with \"Yes\" and \"No\" options"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A date picker that also allows manual entry"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false}},"required":["prompt","type","required","accept"],"additionalProperties":false,"description":"A file uploader"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"An email input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]}},"required":["prompt","type","required"],"additionalProperties":false,"description":"A phone number input with specialized validation"},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"}},"required":["prompt","type","content"],"additionalProperties":false,"description":"A non-interactive text block for displaying disclaimers or informational\ncontent. The `prompt` field acts as an internal label visible only in\nthe form builder."},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"}},"required":["prompt","type","imageUrl"],"additionalProperties":false,"description":"A non-interactive image block for displaying visual content"}]},{"oneOf":[{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"contactField":{"description":"Instead of setting a custom CRM property, text questions may set the\nbuilt-in `firstName` and `lastName` fields on contacts.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["firstName","lastName"]},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Multi-line Text"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Number"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"minValue":{"description":"Smallest value the respondent may enter, if set.","type":"number"},"maxValue":{"description":"Largest value the respondent may enter, if set.","type":"number"},"integerOnly":{"description":"If true, only whole numbers are accepted (no decimals).","type":"boolean"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Number"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"If true, renders as a dropdown list instead of radio buttons.","type":"boolean"},"placeholder":{"description":"Only visible when `dropdown` is true.","type":"string"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select One or \"Other\""]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple"]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"dropdown":{"description":"Reserved for future use, must not be set to true","type":"boolean","enum":[false]},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Select Multiple with \"Other\""]},"options":{"description":"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.","type":"array","items":{"type":"string"}},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.\nIf specified, the property also provides the selectable options, and exactly\none of `propertyId` or `options` must be specified.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["options","type","objectType","status"],"additionalProperties":false},"minChoices":{"type":"number","description":"Minimum number of options that must be selected. Set to 0 to make the question optional."},"maxChoices":{"description":"Maximum number of options that can be selected, or no limit if omitted","type":"number"},"otherPrompt":{"type":"string","description":"The label for the freeform \"Other\" option."},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on selected options","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"optionIndices":{"type":"array","items":{"type":"number"},"description":"The indices of the options in the question's `options` array, or its\ncustom property's options. The way these options are used depends on the\n`operator` property.\nAn index of -1 specifies the \"Other\" option, for applicable question types."},"operator":{"type":"string","enum":["all_of","any_of","none_of"],"description":"The operator applied to the options specified by the `optionIndices` property"}},"required":["revealedElementIndex","optionIndices","operator"],"additionalProperties":false,"description":"A conditional logic group for 'Select One', 'Select One or \"Other\"',\n'Select Multiple' and 'Select Multiple with \"Other\"' questions.\nOne or more of the question's options, as well as the operator applied to said\noptions, define a condition which will reveal another element in the form."}},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","minChoices","otherPrompt","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Yes/No"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"dropdown":{"type":"boolean","description":"Reserved for future use, must be set to true","enum":[true]},"contactField":{"description":"Instead of setting a custom CRM property, yes/no questions may set the\nbuilt-in `status` fields on contacts, which represents whether the contact\nwants to receive communications from the host. The two values that can be\nset by a yes/no question are \"opted-in\" for \"yes\"/true, or \"unsubscribed\"\nfor \"no\"/false.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["status"]},"logicGroups":{"description":"Conditional logic groups that reveal other elements based on the yes/no value.","type":"array","items":{"type":"object","properties":{"revealedElementIndex":{"type":"number","description":"The index of the element in the form's `elements` array which is revealed\nwhen this logic group's condition is satisfied."},"selectionType":{"type":"string","enum":["is","is_not"],"description":"Determines whether the question's value must be strictly equal to the logic\ngroup's `value` property, or not strictly equal to it. Note that\n`undefined` (no answer) is treated differently from an explicit `false`\nanswer."},"value":{"type":"boolean","description":"Determines the value which is compared to the form answer's value for this\nlogic group (the type of comparison depends on the `selectionType` property)."}},"required":["revealedElementIndex","selectionType","value"],"additionalProperties":false,"description":"A conditional logic group for \"Yes/No\" questions, which reveals another\nelement in the form depending on the value in the answer to the question."}},"yesRequired":{"description":"If true, respondents must answer \"Yes\" to this question to submit their response.","type":"boolean"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","dropdown","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Date"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"min":{"description":"Earliest selectable date in YYYY-MM-DD format","type":"string"},"max":{"description":"Latest selectable date in YYYY-MM-DD format","type":"string"},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Date"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["File"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"accept":{"minItems":1,"type":"array","items":{"type":"string","enum":["images","documents","data","audio","video"]},"description":"File categories allowed to be uploaded. Must contain at least one element."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["File"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","accept","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Email"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Email"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, email questions may set the\nbuilt-in `email` field on contacts. A question which sets this contact\nfield is required if any other questions in the form use a `contactField`\nor a Contact CRM property, since email is how contacts are identified.\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["email"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Phone"]},"required":{"type":"boolean","description":"If true, the respondent must answer this question to submit the form."},"propertyId":{"description":"ID of a CRM property that will be set by the answer to this question.\nThe CRM property's data type must align with the question's type.\nFor standalone forms, only Contact properties can be used.\nFor order forms, Ticket properties can be used for ticket-holder questions,\nOrder properties can be used for buyer-only questions, and Contact properties\ncan be used in either section.","type":"string"},"propertyData":{"description":"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.","type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"objectType":{"type":"string","enum":["contact","order","ticket"],"description":"The kind of object that a form-linked CRM property writes to.\n- contact: properties on customer contact records\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."}},"required":["type","objectType","status"],"additionalProperties":false},"placeholder":{"description":"Placeholder text to show when the input is empty.","type":"string"},"contactField":{"description":"Instead of setting a custom CRM property, phone questions may set the\nbuilt-in `phone` field on contacts (i.e. the contact's phone number).\nQuestions may set a CRM property, a contact field, or neither; but not both.","type":"string","enum":["phone"]},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","required","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Text"]},"content":{"type":"string","description":"The text content displayed in the block"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","content","askAllAttendees"],"additionalProperties":false},{"type":"object","properties":{"id":{"description":"The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.","type":"string"},"prompt":{"type":"string","description":"For question elements, the question text; for static elements, a label shown above the element."},"promptHidden":{"description":"If true, the element's prompt will not be shown to respondents.","type":"boolean"},"helperText":{"description":"Optional subtle helper text to display below the element.","type":"string"},"type":{"type":"string","enum":["Static Image"]},"imageUrl":{"type":"string","description":"URL of the image to display"},"imageWidth":{"description":"Display width as a percentage of the container (1-100). Defaults to 100.","type":"number"},"forEventItems":{"description":"For order forms only. Restricts this element to only appear when at least one\nof the referenced event items or products is in the cart. If present (even if\nempty), the element is hidden by default.","type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["eventItem"]},"eventId":{"type":"string"},"itemId":{"type":"string"}},"required":["type","eventId","itemId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["eventProduct"]},"eventId":{"type":"string"},"productId":{"type":"string"}},"required":["type","eventId","productId"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkoutProduct"]},"checkoutId":{"type":"string","description":"The ID of the standalone checkout containing the product."},"productId":{"type":"string"}},"required":["type","checkoutId","productId"],"additionalProperties":false}]}},"askAllAttendees":{"type":"boolean","description":"For order forms only. If true, the element must be in a row greater than or\nequal to `attendeeRowsStart`, and an instance of the element will appear for\nevery ticket in the cart. Otherwise, the element must be in a row less than\n`attendeeRowsStart`, and only a single instance of the element will appear."}},"required":["prompt","type","imageUrl","askAllAttendees"],"additionalProperties":false}]}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/":{"get":{"summary":"List Invoices","tags":["Invoices"],"description":"Lists the host's invoices, optionally filtered by status, recipient, or issue date. Sorted by issuedAt descending. Paginated.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false,"description":"Page number (0-based, default 0)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 100)"},{"schema":{"type":"string","enum":["draft","open","payment_failed","paid","void"]},"in":"query","name":"status","required":false,"description":"Filter by status; omit to include all"},{"schema":{"type":"string"},"in":"query","name":"customerId","required":false,"description":"Filter by recipient contact id"},{"schema":{"type":"string"},"in":"query","name":"subscriptionId","required":false,"description":"Filter to invoices generated by this subscription (renewals, proration adjustments)"},{"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"in":"query","name":"issuedAfter","required":false,"description":"Only invoices issued on or after this date (ISO 8601)"},{"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"in":"query","name":"issuedBefore","required":false,"description":"Only invoices issued on or before this date (ISO 8601)"},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, hostId, customerId, customerEmail, customerFirstName, customerLastName, customerPhone, number, currency, subtotal, taxTotal, total, amountPaid, amountDue, status, autoCharge, issuedAt, dueAt, paidAt, voidedAt, subscriptionId, quoteId, createdAt, updatedAt. Omit for all fields."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Invoice","tags":["Invoices"],"description":"Creates a new draft invoice. Totals are computed from line items. The invoice must be finalized before it is issued to the customer.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email at create time. Stored on the invoice so the record stays complete if the source contact is later deleted.","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone at create time","type":"string"},"currency":{"type":"string","enum":["USD","CAD"],"description":"Three-letter ISO code; all line amounts must be in this currency"},"lineItems":{"minItems":1,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"]}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}}},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"]},"description":"At least one line item is required"},"notes":{"type":"string"},"taxIds":{"description":"Optional host tax-ID snapshot stored on the invoice. Rendered on the issued PDF and email.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"]}},"dueAt":{"description":"Optional payment due date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"autoCharge":{"description":"Opt the invoice into off-session auto-charge. When true, the\n`auto_charge` endpoint can attempt to charge the customer's\nsaved card on file without further user interaction. Stored on\nthe draft; the host can flip this on/off through revise before\nfinalize. Default false.","type":"boolean"}},"required":["customerId","currency","lineItems"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/{id}":{"get":{"summary":"Get Invoice","tags":["Invoices"],"description":"Retrieves a single invoice by id.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, hostId, customerId, customerEmail, customerFirstName, customerLastName, customerPhone, number, currency, lineItems, payments, subtotal, taxTotal, total, amountPaid, amountDue, status, autoCharge, notes, taxIds, issuedAt, dueAt, paidAt, voidedAt, subscriptionId, quoteId, createdAt, updatedAt. Omit for all fields."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Revise Invoice","tags":["Invoices"],"description":"Edits a draft invoice. Only legal while in draft — use void plus create-new for finalized invoices. Totals recompute when line items change.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"customerId":{"description":"New CRM contact id of the recipient","type":"string"},"customerEmail":{"description":"Updated snapshot of the recipient's email","type":"string"},"customerFirstName":{"description":"Updated snapshot of the recipient's first name","type":"string"},"customerLastName":{"description":"Updated snapshot of the recipient's last name","type":"string"},"customerPhone":{"description":"Updated snapshot of the recipient's phone","type":"string"},"lineItems":{"description":"Replacement line items; totals will be recomputed","minItems":1,"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"]}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}}},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"]}},"notes":{"type":"string"},"taxIds":{"description":"Replaces the existing tax-ID snapshot in full. Pass [] to clear.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"]}},"dueAt":{"description":"Updated payment due date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Draft Invoice","tags":["Invoices"],"description":"Permanently removes a draft invoice. Only legal while in draft (no number issued); finalized invoices must be voided instead so the audit trail stays intact.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","description":"Id of the deleted invoice"}},"required":["id"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/{id}/finalize":{"post":{"summary":"Finalize Invoice","tags":["Invoices"],"description":"Transitions a draft invoice to open, assigns a sequential number, and stamps issuedAt. Pass sendEmail=true to also email the customer their invoice (payment-link, or receipt for a zero-dollar auto-pay) as part of finalizing.","parameters":[{"schema":{"type":"string"},"in":"query","name":"sendEmail","required":false,"description":"When true, email the customer as part of finalizing: an invoice\nleft `open` gets a payment-link email (Pay button + invoice PDF);\na zero-dollar invoice that auto-pays on finalize gets its receipt.\nRequires a customer email on the invoice. Default false (finalize only)."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/{id}/send":{"post":{"summary":"Send Invoice Email","tags":["Invoices"],"description":"Emails the customer their invoice. An `open` (or\n`payment_failed`) invoice gets a payment-link email, Pay button\nplus the invoice PDF; a `paid` invoice gets its receipt.\nRe-callable, so it doubles as a resend. Rejects `draft` invoices\n(finalize first) and `void` ones with a 409. Requires a customer\nemail on the invoice.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/{id}/void":{"post":{"summary":"Void Invoice","tags":["Invoices"],"description":"Voids an invoice. Permitted from draft or open. Paid invoices cannot be voided.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"description":"Optional reason recorded on the invoice.voided event","type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/{id}/payments":{"post":{"summary":"Mark Invoice Paid","tags":["Invoices"],"description":"Records a manual payment against an open invoice. Cumulative payments meeting the total transition the invoice to paid.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"payment":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Payment amount in the invoice currency, minor units"},"idempotencyKey":{"description":"Caller-supplied dedupe key. Replaying the same key for the same invoice is a no-op.","type":"string"},"note":{"description":"Free-form note recorded on the payment (e.g. payment method)","type":"string"}},"required":["payment"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/{id}/auto_charge":{"post":{"summary":"Auto-Charge Invoice","tags":["Invoices"],"description":"Off-session charge against the customer's saved card. Legal on\ninvoices in `open` or `payment_failed` status. Success ->\ninvoice transitions to `paid` (returned in the response).\nFailure (card decline, SCA, no saved card) -> invoice\ntransitions to `payment_failed`; the response still returns\n200 with the invoice's post-failure state plus a\n`failureCode`. Network / 5xx errors against the processor\nsurface as 502. The host must already have a connected Stripe\naccount in good standing.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false},"outcome":{"type":"string","enum":["paid","failed"],"description":"`paid` when the charge cleared (invoice transitions to paid);\n`failed` for declines / SCA / missing card (invoice transitions\nto payment_failed). Network errors don't reach this field —\nthey surface as 502."},"failureCode":{"description":"Set on outcome `failed`. Stripe error code\n(`'card_declined'`, `'authentication_required'`, ...) or\n`'no_payment_method_on_file'` when the contact has no saved\ncard. Lets the client tailor its fallback (e.g. surface a\npayment-link CTA).","type":"string"}},"required":["data","outcome"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/invoices/{id}/payments/{paymentId}/refunds":{"post":{"summary":"Refund Invoice Payment","tags":["Invoices"],"description":"Issues a partial or full refund against a Stripe-Connect payment\non a paid invoice. Platform fees are non-refundable: the host must\nhave enough connected-account balance to absorb the fee hit when\nrefunding the gross amount. Idempotent on caller-supplied\n`idempotencyKey` — replays return the existing refund without\ncontacting Stripe.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Refund amount, minor units of the invoice currency. Capped at the\nremaining refundable amount on the target payment (gross −\nΣ priorRefunds). Platform fees are non-refundable, so the host\nmust have enough connected-account balance to absorb the fee hit\nwhen refunding the full payment."},"reason":{"description":"Stripe refund reason; passed through to Stripe","type":"string","enum":["duplicate","fraudulent","requested_by_customer"]},"note":{"description":"Free-form internal note (not shown to the customer)","type":"string"},"idempotencyKey":{"description":"Caller dedupe key. Replays return the existing refund without contacting Stripe.","type":"string"}},"required":["amount"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Invoice id, discoverable via list_invoices"},{"schema":{"type":"string"},"in":"path","name":"paymentId","required":true,"description":"Id of the payment subdoc on the invoice we are reversing"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"customerId":{"type":"string","description":"CRM contact id of the recipient"},"customerEmail":{"description":"Snapshot of the recipient's email captured at create time","type":"string"},"customerFirstName":{"description":"Snapshot of the recipient's first name captured at create time","type":"string"},"customerLastName":{"description":"Snapshot of the recipient's last name captured at create time","type":"string"},"customerPhone":{"description":"Snapshot of the recipient's phone captured at create time","type":"string"},"number":{"description":"Sequential invoice number; null while in draft","type":"string","nullable":true},"currency":{"type":"string","enum":["USD","CAD"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description shown on the invoice"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Whole units billed"},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit price in the invoice currency, minor units (cents for USD)"},"productId":{"description":"Optional reference to a Product in the catalog","type":"string"},"priceId":{"description":"Optional reference to the Price doc that backed this line (subscription billing)","type":"string"},"eventId":{"description":"Optional reference to an Event when the underlying product was event-attached","type":"string"},"taxAmount":{"description":"Optional tax for this line, minor units","type":"integer","minimum":0,"maximum":9007199254740991},"productType":{"description":"Snapshot of the product type at line-creation time; drives post-payment fulfillment","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productName":{"description":"Snapshot of the product display name at line-creation time","type":"string"},"components":{"description":"Snapshot of the bundle's components, flat-expanded by qty. Set\nonly when `productType === \"bundle\"`. Carries each component's\nproduct id + display name + image URL + (when applicable) event\n+ seating snapshot so the fulfillment pipeline can issue\ninformation-equivalent component tickets and the tickets PDF\ncan render the legacy \"ticket\"-style block per item.","type":"array","items":{"type":"object","properties":{"productId":{"type":"string"},"productName":{"type":"string"},"productType":{"description":"Catalog product type for the component — drives sort + visual treatment in the rendered bundle items list.","type":"string","enum":["product","add-on","bundle","donation","event-ticket"]},"productImageUrl":{"type":"string"},"eventId":{"description":"Per-component parent event id — snapshotted onto the issued component ticket as legacy `event_id` so b2c availability and seat-occupation queries see the sale.","type":"string"},"eventImageUrl":{"description":"Component event hero image — fallback artwork for the pulled-out ticket card when the component product has no image.","type":"string"},"eventName":{"type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the component's event/timeslot.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the component event — drives printed-date localization on the pulled-out ticket.","type":"string"},"seatingInformation":{"type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false,"description":"Slim venue seating assignment. The display labels (sectionId,\nrowId, seatId) are what the printed ticket shows; the reference\nids are preserved for compatibility with the legacy seat-chart\nsystem."},"disableQrCode":{"description":"Component product's own disable_qr_code — the issued component ticket skips its QR (printable stub only).","type":"boolean"},"willCall":{"description":"Component product's own will_call — the issued component ticket uses will call fulfillment (no stub, collected at the venue).","type":"boolean"}},"required":["productId","productName"],"additionalProperties":false}},"disableQrCode":{"description":"Snapshot of the underlying `Product.disable_qr_code` flag.\nWhen true, the issued ticket renders a \"No scan\" badge on the PDF\nand skips QR generation. Donations are scannable by default unless\nthe host opts the product out via this flag.","type":"boolean"},"willCall":{"description":"Snapshot of the underlying `Product.will_call` flag. When true,\nthe issued ticket uses will call fulfillment: no PDF stub is\nrendered, the ticket is not scannable, and the customer collects\nit at the venue. Independent of `disableQrCode`.","type":"boolean"},"productImageUrl":{"description":"Snapshot of the underlying `Product.image` URL — rendered as\nthe ticket-stub artwork on the issued PDF. Absent products fall\nback to the event image (when set), then to a typographic\nplaceholder.","type":"string"},"eventName":{"description":"Snapshot of the parent event's display name when the line was event-attached.","type":"string"},"eventImageUrl":{"description":"Snapshot of the parent event's hero image URL — the renderer\nuses it as the ticket-stub artwork fallback when the product\nitself has no image.","type":"string"},"eventStart":{"description":"ISO 8601 start datetime for the parent event (or per-occurrence timeslot).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventEnd":{"description":"ISO 8601 end datetime for the parent event.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"eventLocation":{"description":"Pre-formatted location label snapshotted at line creation.","type":"string"},"eventTimezone":{"description":"IANA timezone identifier for the parent event (e.g.\n`America/Los_Angeles`). Drives printed-date localization\nso the holder sees the event-local time + TZ abbreviation.","type":"string"},"seatingInformation":{"description":"Per-line venue seating assignment. Mirrors the legacy\n`seatingInformation` field on a ticket so the new tickets\nPDF prints the same seat info the legacy PDF did.","type":"object","properties":{"sectionId":{"description":"Section display label (e.g. \"A\").","type":"string"},"rowId":{"description":"Row display label (e.g. \"5\").","type":"string"},"seatId":{"description":"Seat display label (e.g. \"12\").","type":"string"},"seatReferenceId":{"type":"string"},"sectionReferenceId":{"type":"string"},"priceLevelId":{"type":"string"}},"additionalProperties":false},"inventoryConsumedAt":{"description":"Stamped by the fulfillment pipeline once\n`InventoryRepository.consume()` has succeeded for this\nline. Drives per-line consume idempotency: a replayed\nfulfillment skips already-stamped lines and runs consume\non unstamped ones, so a partial-failure state (tickets\npersisted but consume threw) recovers without\ndouble-decrementing inventory.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["description","quantity","unitAmount"],"additionalProperties":false}},"payments":{"description":"Audit log of every payment applied to this invoice","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["succeeded","failed"],"description":"Outcome of this payment attempt.\n- succeeded: money was captured. Counts toward the parent invoice's\n`amountPaid` total.\n- failed: an auto-charge attempt was rejected (decline / SCA / no\ncard). Kept on the audit log for visibility; does NOT count\ntoward `amountPaid`."},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Amount applied, minor units"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"description":"Caller-supplied dedupe key, if one was provided","type":"string"},"note":{"description":"Free-form note (payment method, upstream provider id, etc.)","type":"string"},"externalId":{"description":"Stripe PaymentIntent id (`pi_…`) for Stripe-Connect payments","type":"string"},"chargeId":{"description":"Stripe Charge id (`ch_…`); refund operations key off this","type":"string"},"failureCode":{"description":"Stripe error code on a failed attempt (e.g. `card_declined`, `authentication_required`)","type":"string"},"failureMessage":{"description":"Stripe customer-facing decline message on a failed attempt","type":"string"},"refunds":{"description":"Refunds applied against this payment. Cumulative refunds are\ncapped at `amount`; the host's true net = amount - sum(refunds).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Refund amount, minor units of the parent invoice currency"},"refundedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"idempotencyKey":{"type":"string"},"reason":{"description":"Stripe reason: duplicate | fraudulent | requested_by_customer","type":"string"},"note":{"description":"Free-form host note (internal, not shown to customer)","type":"string"},"externalRefundId":{"description":"Stripe Refund id (`re_…`) for ops lookups","type":"string"},"ledgerEntryId":{"description":"Pointer to the matching Ledger row that drives payouts","type":"string"}},"required":["id","amount","refundedAt"],"additionalProperties":false}}},"required":["id","status","amount","paidAt"],"additionalProperties":false}},"subtotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of (qty * unitAmount), minor units"},"taxTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of line taxAmount, minor units"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"subtotal + taxTotal, minor units"},"amountPaid":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of payments received, minor units"},"amountDue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"total - amountPaid, clamped to >= 0"},"status":{"type":"string","enum":["draft","open","payment_failed","paid","void"],"description":"Invoice lifecycle status.\n- draft: not yet issued; freely editable\n- open: finalized and issued; awaiting payment\n- payment_failed: an off-session auto-charge attempt was rejected\n(decline / SCA / no card). The invoice is still owed; the host\ncan retry the charge or the customer can pay manually.\n- paid: fully paid\n- void: cancelled before payment"},"autoCharge":{"type":"boolean","description":"When true, finalize attempts to off-session charge the customer's\nsaved card immediately. On charge success the invoice transitions\nstraight to `paid`; on failure to `payment_failed`. Default\nfalse — host has to opt in."},"notes":{"type":"string"},"taxIds":{"description":"Snapshot of the host's registered tax-IDs at the time the invoice\nwas issued. Rendered alongside the host's company info on the PDF\nand email body. Optional/empty when the host hasn't recorded any.","type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Internal type code for the tax-ID (e.g. 'us_ein', 'ca_gst_hst', 'eu_vat').\nDisplay labels are derived at render time so the persisted invoice\ndoesn't bake in a label that might be reworded."},"value":{"type":"string","description":"The tax-ID number as the host has it registered"}},"required":["type","value"],"additionalProperties":false}},"issuedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dueAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"paidAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"voidedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"subscriptionId":{"description":"Set when generated by a billing Subscription","type":"string"},"quoteId":{"description":"Set when accepted from a Quote","type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/orders/":{"get":{"summary":"List Orders","tags":["Orders"],"description":"Lists the host's orders as the compact dashboard projection, filtered and\npaginated. Refunded/non-refunded and box-office are the same list with a\nfilter: pass refunded=true|false or isBoxOffice=true. Sorted by created\ndate descending.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false,"description":"Page number (0-based, default 0)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":500},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 500)"},{"schema":{"type":"string"},"in":"query","name":"eventId","required":false,"description":"Filter to one event"},{"schema":{"type":"string"},"in":"query","name":"productSetId","required":false,"description":"Filter to one product set"},{"schema":{"type":"string"},"in":"query","name":"timeslotId","required":false,"description":"Filter to one timeslot"},{"schema":{"type":"string"},"in":"query","name":"contactId","required":false,"description":"Filter to one contact"},{"schema":{"type":"string"},"in":"query","name":"purchaserId","required":false,"description":"Filter to one purchaser"},{"schema":{"type":"string"},"in":"query","name":"orderNumber","required":false,"description":"Exact order number"},{"schema":{"type":"string","enum":["pending","paid","processing","completed","cancelled","refunded"]},"in":"query","name":"orderStatus","required":false,"description":"Filter by lifecycle status"},{"schema":{"type":"string","enum":["booking","ticket","product"]},"in":"query","name":"type","required":false,"description":"Filter by order type"},{"schema":{"type":"string"},"in":"query","name":"status","required":false,"description":"true = paid/completed orders only"},{"schema":{"type":"string"},"in":"query","name":"refunded","required":false,"description":"true = refunded only; false = non-refunded only"},{"schema":{"type":"string"},"in":"query","name":"isBoxOffice","required":false,"description":"true = box-office orders only"},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false,"description":"Sort by created date (default: desc)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"customerName":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"date":{"description":"Order placed date (ISO 8601)","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"type":{"type":"string","enum":["booking","ticket","product"],"description":"Order line type."},"amount":{"type":"number","description":"Gross (total paid) in cents."},"quantity":{"type":"number"},"status":{"type":"boolean","description":"True for completed (paid) orders."},"orderStatus":{"type":"string","enum":["pending","paid","processing","completed","cancelled","refunded"],"description":"Order lifecycle status."},"paymentMethod":{"type":"string"},"currency":{"type":"string"},"discount":{"type":"number"},"fees":{"type":"number"},"promos":{"type":"array","items":{"type":"string"}},"refundedAmount":{"type":"number"},"refLabel":{"type":"string"},"walletLink":{"type":"string"},"eventId":{"type":"string"},"refunded":{"type":"boolean"},"cancelled":{"type":"boolean"},"isBoxOffice":{"type":"boolean"},"manuallyAdded":{"type":"boolean"},"comped":{"type":"boolean"},"latestCharge":{"type":"string"},"disputeStatus":{"type":"string"},"accessCodes":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"benefitType":{"type":"string"}},"required":["code"],"additionalProperties":false}},"product_set_id":{"type":"string"}},"required":["id","customerName","firstName","lastName","email","amount","quantity","status","discount","fees","eventId"],"additionalProperties":{}}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/orders/kickback/balance":{"get":{"summary":"Get Kickback Balance","tags":["Orders"],"description":"Returns the available and pending kickback balance grouped by currency, each bucket listing its contributing orders and tickets. Money is in cents.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"available_balance":{"type":"object","properties":{"kickback_balance":{"type":"number","description":"Kickback total for this bucket, in cents."},"kickback_balance_orders":{"type":"array","items":{"type":"object","properties":{"_id":{},"gross":{"type":"number"},"fees":{"type":"number"},"threeCFee":{"type":"number"},"stripeFee":{"type":"number"},"refundedAmount":{"type":"number"},"latest_charge":{"type":"string"},"event_id":{"type":"string"}},"additionalProperties":{}}},"currency":{"type":"string","nullable":true}},"required":["kickback_balance","kickback_balance_orders","currency"],"additionalProperties":false},"pending_balance":{"type":"object","properties":{"kickback_balance":{"type":"number","description":"Kickback total for this bucket, in cents."},"kickback_balance_orders":{"type":"array","items":{"type":"object","properties":{"_id":{},"gross":{"type":"number"},"fees":{"type":"number"},"threeCFee":{"type":"number"},"stripeFee":{"type":"number"},"refundedAmount":{"type":"number"},"latest_charge":{"type":"string"},"event_id":{"type":"string"}},"additionalProperties":{}}},"currency":{"type":"string","nullable":true}},"required":["kickback_balance","kickback_balance_orders","currency"],"additionalProperties":false},"currency":{"type":"string","nullable":true}},"required":["available_balance","pending_balance","currency"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/orders/kickback/total":{"get":{"summary":"Get Kickback Total","tags":["Orders"],"description":"Returns the sum of kickback across the host's active, not-on-hold orders, in cents.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"number"}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/orders/checkout/{id}/details":{"get":{"summary":"Get Checkout Details","tags":["Orders"],"description":"Returns a product set's products (grouped by type) with inventory, plus every order and ticket for that set.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Product set ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"products":{"type":"object","properties":{"mode":{"type":"string","enum":["product-set"]},"data":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"One entry per set: { productSetId, productsByType }"},"inventoryByProductId":{"type":"object","additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"required":["mode","data","inventoryByProductId"],"additionalProperties":false},"tickets":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"All tickets for the product set"},"orders":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"All orders for the product set"}},"required":["products","tickets","orders"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/orders/{id}/tickets":{"get":{"summary":"List Order Tickets","tags":["Tickets"],"description":"Lists all tickets for an order (newest first), each with its looked-up event and optionally its ledger entries.","parameters":[{"schema":{"type":"string"},"in":"query","name":"includeLedger","required":false,"description":"Attach each ticket's ledger entries"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Order ID"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/":{"get":{"summary":"List Pages","tags":["Pages"],"description":"Fetch a paginated list of the user's pages as lightweight summaries (ID,\nname, medium). Results are sorted by name, ascending, unless the sort/order\ninputs say otherwise, and search matches page names case-insensitively.\nUse get_page to fetch a page's full content.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":50,"type":"integer","exclusiveMinimum":true,"maximum":250,"minimum":0},"in":"query","name":"pageSize","required":false},{"schema":{"default":"name","type":"string","enum":["name","medium"]},"in":"query","name":"sort","required":false,"description":"Field to sort results by. Valid fields:\nname, medium"},{"schema":{"default":"asc","type":"string","enum":["asc","desc"]},"in":"query","name":"order","required":false,"description":"Sort direction."},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Searches page names, case-insensitive."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."}},"required":["id","name","medium"],"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Page","tags":["Pages"],"description":"Create a new page. The page starts with one empty section and is persisted\nimmediately. Returns the created page, including its generated ID and the\nID of its initial section.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"background":{"default":{"type":"color","color":"#ffffff"},"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"]}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."}},"required":["name","medium"]}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}":{"get":{"summary":"Get Page","tags":["Pages"],"description":"Fetch the full content of a page: its sections, their elements (with IDs,\ntypes, properties, and per-breakpoint layouts), and page-level properties.\nCall this before editing a page to learn the section and element IDs the\nmutation tools target. A text element's `richText` is returned as an HTML\nstring (the same format update_page_element_properties accepts). When this\nconversation's edits to the page are staged in a temporary working copy (see\nthe persisted field on mutation outputs and the source field here), this\nreturns that working copy, so it always reflects your own earlier edits from\nthis turn.","parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Page Properties","tags":["Pages"],"description":"Update page-level properties: the page's name and/or its background. Only\nthe provided fields change. The page background is required and can only be\nreplaced, never removed (sections and elements have their own optional\nbackgrounds layered on top of it).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"]}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}/duplicate":{"post":{"summary":"Duplicate Page","tags":["Pages"],"description":"Duplicate an existing page. It is strongly recommended to include a new name\nin the input, to avoid confusion due to multiple pages having the same name.\nThe rest of the page's properties will be identical to the original, apart\nfrom its `id` and `revisionCount`.\nThe duplicate is created from the last saved version of the page, which may\nnot include unsaved editor changes or edits staged during this conversation\nturn.\nA text element's `richText` is returned as an HTML string (the same format\nget_page returns and update_page_element_properties accepts).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"description":"A new name to use for the duplicated page. If not specified, the new page\nwill use the same name as the original.","type":"string"}},"nullable":true}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}/elements":{"post":{"summary":"Insert Page Element","tags":["Pages"],"description":"Insert a new element into a section of a page.\nCall get_page first to learn the page's current structure and the IDs to target.\nA section is a grid: its column count is fixed by the page's medium and\nbreakpoint (email pages have a single \"default\" breakpoint with\n12 columns), and its row count is a per-section\nproperty. A layout places an element with a 0-based top-left cell (row, col)\nand a span (rowSpan, colSpan). The placement must fit inside the section's\ngrid and must not overlap another element in the same breakpoint. To make\nroom, raise the section's row count with update_page_section_properties first.\nThe element type must be supported by the page's medium. The new element is\ncreated with default properties; customize it with\nupdate_page_element_properties. The element's ID is generated by the server\nand returned as elementId, use it to target the element in follow-up edits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sectionId":{"type":"string","description":"The section to insert the element into."},"type":{"type":"string","enum":["divider","text","button","image","socialLinks","table","qrCode"],"description":"Element type; must be supported by the page's medium."},"breakpoint":{"type":"string","enum":["default"],"description":"Breakpoint the placement is given in; must be supported by the medium."},"layout":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"colSpan":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0}},"required":["row","col","rowSpan","colSpan"],"description":"Cell placement within the section's grid for the given breakpoint."}},"required":["sectionId","type","breakpoint","layout"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false},"elementId":{"type":"string","description":"The server-generated ID of the new element."}},"required":["data","elementId"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}/elements/{elementId}":{"patch":{"summary":"Update Page Element Properties","tags":["Pages"],"description":"Update an element's own properties: its type-specific fields, per-side\npadding, and background.\nCall get_page first to learn the page's current structure and the IDs to target.\nOnly the provided fields change, and provided type-specific fields must\nbelong to the element's type. For a text element, provide `richText` as an\nHTML string (unsupported tags and attributes are dropped).\nPadding merges per side (only the provided sides change). The background can\nbe set to null to clear it, making the element transparent. An element's ID\nand type can never change, and its placement is changed with\nedit_page_element_layout instead.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"props":{"type":"object","properties":{"padding":{"description":"Per-side padding merge: only the provided sides change.","type":"object","properties":{"top":{"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"background":{"description":"The element's new background, or null to clear it.","anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"]}]},{"nullable":true,"enum":[null]}]},"richText":{"description":"Only for 'text' elements: the structured JSON content.","type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletListInput"},{"$ref":"#/components/schemas/TextOrderedListInput"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"description":"For 'text' elements: the color of all text except links. For 'button' elements: the color of the button's label.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"linkColor":{"description":"Only for 'text' elements: the color of link text.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"orientation":{"description":"Only for 'divider' elements: the divider's orientation.","type":"string","enum":["vertical","horizontal"]},"color":{"description":"Only for 'divider' elements: the divider's color.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"label":{"description":"Only for 'button' elements: the text shown on the button.","type":"string"},"href":{"description":"Only for 'button' and 'image' elements: the destination URL, or one complete\n{{smart value}} token. An empty string or a token that yields no usable URL\nresults in an element with no link.","type":"string"},"fillColor":{"description":"For 'button' and 'socialLinks' elements: the color of the button surface(s), drawn inside the element's padding. Set 'background' instead to fill the whole cell behind them.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"fontSize":{"description":"Only for 'button' elements: the size of the button's text, in pixels.","type":"integer","minimum":8,"maximum":48},"borderRadius":{"description":"Only for 'button' elements: the button's corner rounding, in pixels.","type":"integer","minimum":0,"maximum":40},"image":{"description":"Only for 'image' elements: the image to display, referenced by the ID of\nan image asset.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."}},"required":["assetId"],"additionalProperties":false},"alt":{"description":"For 'image' and 'qrCode' elements: the alternative text a screen reader announces, and a client which blocks images displays.","type":"string"},"horizontalAlign":{"description":"For 'image' and 'qrCode' elements: the horizontal alignment of the content. For 'socialLinks' elements: the alignment of the row of buttons.","type":"string","enum":["left","center","right"]},"verticalAlign":{"description":"For 'image' and 'qrCode' elements: the vertical alignment of the content.","type":"string","enum":["top","middle","bottom"]},"qrValue":{"description":"Only for 'qrCode' elements: what the code encodes, replaced as a whole. Set\n`source` to 'literal' with a `value` for a fixed payload, or to\n'smartValue' with a bare `smartValueKey` for a per-recipient one. The\npayload does not have to be a URL.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"socialLinks":{"description":"Only for 'socialLinks' elements: the complete, ordered list of links. This\nreplaces the current list rather than merging into it, so send every entry\nthat should remain. A freshly inserted element has no links and renders\nnothing until this is set.","maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false}},"socialButtonSize":{"description":"Only for 'socialLinks' elements: the side length of each square button, in pixels.","type":"integer","minimum":32,"maximum":80},"socialGap":{"description":"Only for 'socialLinks' elements: the space between adjacent buttons, in pixels.","type":"integer","minimum":0,"maximum":32},"socialBorderRadius":{"description":"Only for 'socialLinks' elements: the corner rounding of each button, in pixels.","type":"integer","minimum":0,"maximum":40},"tableColumns":{"description":"The table's columns, left to right, replaced as a whole. Each column's\n`source` decides where its body cells come from.","minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]}},"tableRowCount":{"description":"How many body rows the table renders when no column is bound to a smart\nvalue. When one is, the longest bound array sets the row count instead,\nexcept that this stays a lower bound for as long as any column's `source`\nis 'literal'. Unrelated to the section's grid rows.","type":"integer","minimum":1,"maximum":50},"tableShowHeader":{"description":"Whether the table renders a header row of its columns' labels.","type":"boolean"},"tableFontSize":{"description":"Size of the text in every table cell, in pixels.","type":"integer","minimum":9,"maximum":24},"tableHeaderTextColor":{"description":"Color of the table header cells' text.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"tableBodyTextColor":{"description":"Color of the table body cells' text.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"tableHeaderFillColor":{"description":"Fill behind the table's header cells.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"tableBodyFillColor":{"description":"Fill behind the table's body cells. Set 'background' instead to fill the\nwhole cell behind the table.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"tableBorderColor":{"description":"Color of the grid lines drawn between and around the table's cells.","type":"string","pattern":"^#[0-9a-fA-F]{6}$"}},"additionalProperties":false}},"required":["props"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Page Element","tags":["Pages"],"description":"Delete an element from its section. The section itself remains, even if it\nbecomes empty.\nCall get_page first to learn the page's current structure and the IDs to target.","parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}/elements/{elementId}/layout":{"patch":{"summary":"Edit Page Element Layout","tags":["Pages"],"description":"Move and/or resize an element within its section by providing its complete\nnew cell placement for a breakpoint.\nCall get_page first to learn the page's current structure and the IDs to target.\nA section is a grid: its column count is fixed by the page's medium and\nbreakpoint (email pages have a single \"default\" breakpoint with\n12 columns), and its row count is a per-section\nproperty. A layout places an element with a 0-based top-left cell (row, col)\nand a span (rowSpan, colSpan). The placement must fit inside the section's\ngrid and must not overlap another element in the same breakpoint. To make\nroom, raise the section's row count with update_page_section_properties first.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"breakpoint":{"type":"string","enum":["default"],"description":"Breakpoint whose layout is being set; must be supported by the medium."},"layout":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"colSpan":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0}},"required":["row","col","rowSpan","colSpan"],"description":"The new cell placement (position and span) for the breakpoint."}},"required":["breakpoint","layout"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true},{"schema":{"type":"string"},"in":"path","name":"elementId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}/sections":{"post":{"summary":"Add Page Section","tags":["Pages"],"description":"Add a new, empty full-width section to a page, appended after the existing\nsections by default, or inserted at `index`. The section starts with the\ndefault row count for each of the medium's breakpoints. The section's ID is\ngenerated by the server and returned as sectionId, use it to target the\nsection in follow-up edits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"index":{"description":"Where to insert the section, appends by default. Must be in the range\n[0, sections.length] (length appends), unlike move-section whose target is\nan existing slot.","type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false,"nullable":true}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false},"sectionId":{"type":"string","description":"The server-generated ID of the new section."}},"required":["data","sectionId"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}/sections/{sectionId}":{"patch":{"summary":"Update Page Section Properties","tags":["Pages"],"description":"Update a section's row counts and/or background.\nCall get_page first to learn the page's current structure and the IDs to target.\nRow counts are per breakpoint and only the provided breakpoints change;\nreducing a row count below rows an element still occupies is rejected\n(move or shrink the element first). The background can be set to null to\nclear it, revealing the page background behind the section.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rows":{"description":"New row counts, per breakpoint. Only the provided breakpoints change, and\neach must be supported by the medium. Reducing a count below an element\nthat occupies those rows in that breakpoint is rejected.","type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"background":{"description":"A new background, or null to clear it (revealing the page background).","anyOf":[{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"]}]},{"nullable":true,"enum":[null]}]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true},{"schema":{"type":"string"},"in":"path","name":"sectionId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Page Section","tags":["Pages"],"description":"Delete a section and all of the elements in it. A page must always have at\nleast one section, so deleting the last remaining section is rejected.\nCall get_page first to learn the page's current structure and the IDs to target.","parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true},{"schema":{"type":"string"},"in":"path","name":"sectionId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/pages/{pageId}/sections/{sectionId}/position":{"put":{"summary":"Move Page Section","tags":["Pages"],"description":"Reorder a section to a new 0-based index within the page's existing\nsections. Sections are stacked vertically in array order.\nCall get_page first to learn the page's current structure and the IDs to target.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"toIndex":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The section's desired final index. Must be in [0, sections.length - 1]: the\narray size is unchanged, unlike add-section which can target length."}},"required":["toIndex"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"pageId","required":true},{"schema":{"type":"string"},"in":"path","name":"sectionId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"name":{"type":"string","description":"The name of the content, for easy identification by the creator (not visible\nin the rendered output)."},"medium":{"type":"string","enum":["email"],"description":"The medium this page belongs to. Determines what kind of elements its\nsections can contain, and which breakpoints are supported (which in turn\ndetermines page width and the number of columns in each section)."},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"elements":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["divider"]},"orientation":{"type":"string","enum":["vertical","horizontal"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["id","padding","layout","type","orientation","color"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["text"]},"richText":{"type":"object","properties":{"type":{"type":"string","enum":["doc"]},"content":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["paragraph"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]}},"required":["textAlign"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"attrs":{"type":"object","properties":{"textAlign":{"default":"left","type":"string","enum":["left","center","right","justify"]},"level":{"type":"number","enum":[1,2,3]}},"required":["textAlign","level"],"additionalProperties":false},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","minLength":1},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["hardBreak"]},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["smartValue"]},"attrs":{"type":"object","properties":{"key":{"type":"string","minLength":1}},"required":["key"],"additionalProperties":false},"marks":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["bold","italic","strike","underline"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"attrs":{"type":"object","properties":{"href":{"type":"string","minLength":1,"description":"The link's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. This field\nis never empty, because text with no destination is not a link."}},"required":["href"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["textStyle"]},"attrs":{"type":"object","properties":{"fontSize":{"type":"number","enum":[8,9,10,11,12,14,18,24,30,36,48,60,72,96]}},"required":["fontSize"],"additionalProperties":false}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false}]}}},"required":["type","attrs"],"additionalProperties":false},{"$ref":"#/components/schemas/TextBulletList"},{"$ref":"#/components/schemas/TextOrderedList"}]}}},"required":["type","content"],"additionalProperties":false},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to all of the element's text, except links."},"linkColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the element's link text."}},"required":["id","padding","layout","type","richText","textColor","linkColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["button"]},"label":{"type":"string","description":"The text shown on the button."},"href":{"type":"string","description":"The button's destination: a URL, or one complete {{smart value}} token. The\nrenderer replaces the token and validates the result as a URL. An empty\nstring or a token that gives no usable URL leaves the button with no link."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surface itself, drawn inside the element's padding. Distinct from `background`, which fills the whole cell behind it."},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color applied to the button's label."},"fontSize":{"type":"integer","minimum":8,"maximum":48,"description":"Size of the button's text, in pixels."},"borderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of the button, in pixels. Zero is a square button."}},"required":["id","padding","layout","type","label","href","fillColor","textColor","fontSize","borderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["image"]},"image":{"description":"The image to display, absent until one has been chosen. An image element can\nbe placed and resized before it has any content.","type":"object","properties":{"assetId":{"type":"string","description":"ID of the registered image asset this element displays."},"src":{"type":"string","description":"The asset's public download URL at the time it was chosen, denormalized so\nrenderers need no asset lookup."},"width":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel width, used to preserve its aspect ratio.","minimum":0},"height":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"The asset's intrinsic pixel height, used to preserve its aspect ratio.","minimum":0},"filename":{"type":"string","description":"The asset's original filename, so the editor can name the chosen image."}},"required":["assetId","src","width","height","filename"],"additionalProperties":false},"alt":{"type":"string","description":"Alternative text describing the image, read by screen readers and shown by\nclients which block images. Can be left empty, but is recommended for\naccessibility."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the image sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the image sits vertically when it is shorter than the space available\nto it."},"href":{"type":"string","description":"Link which wraps the image. Leave empty for plain images."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign","href"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["socialLinks"]},"socialLinks":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["website","facebook","instagram","twitter","linkedin","email"],"description":"Which platform's icon this entry shows."},"href":{"type":"string","description":"The entry's destination URL, or an empty string for no link. A {{smart value}} token is not resolved here, so it leaves the entry with no link."}},"required":["platform","href"],"additionalProperties":false},"description":"The buttons to show, ordered left to right. May be empty, in which case the\nelement renders nothing. The same platform may appear more than once."},"fillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the button surfaces themselves, drawn inside the element's\npadding. Distinct from `background`, which fills the whole cell behind\nthem."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the row of buttons sits horizontally when it is narrower than the\nspace available to it."},"socialButtonSize":{"type":"integer","minimum":32,"maximum":80,"description":"Side length of each square button, in pixels."},"socialGap":{"type":"integer","minimum":0,"maximum":32,"description":"Space between adjacent buttons, in pixels."},"socialBorderRadius":{"type":"integer","minimum":0,"maximum":40,"description":"Corner rounding of each button, in pixels. Zero is a square button, half of the button size is a circle."}},"required":["id","padding","layout","type","socialLinks","fillColor","horizontalAlign","socialButtonSize","socialGap","socialBorderRadius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["table"]},"tableColumns":{"minItems":1,"maxItems":6,"type":"array","items":{"oneOf":[{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["literal"]},"cells":{"maxItems":50,"type":"array","items":{"type":"string"},"description":"The column's body cells, top to bottom, as plain text. This array does not\nhave to match the table's rendered row count: entries past it are ignored,\nand rows past the end of it render empty."}},"required":["label","align","source","cells"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["repeating"]},"value":{"type":"string","description":"One plain-text value, echoed in every rendered row. Useful for a constant\nbeside a column bound to a smart value; a repeating column never affects the\ntable's row count."}},"required":["label","align","source","value"],"additionalProperties":false},{"type":"object","properties":{"label":{"type":"string","description":"The column's header text, shown when the element's `tableShowHeader` is\ntrue. Plain text: a smart value cannot be embedded in it."},"align":{"type":"string","enum":["left","center","right"],"description":"Horizontal alignment of this column's header and body cells."},"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of an array smart value ('order.productNames', not\n'{{order.productNames}}'), resolved at render time to fill this column's\nbody cells, one per row. The longest bound column decides how many rows the\ntable renders, except that the element's `tableRowCount` stays a lower\nbound while any column's `source` is 'literal'; a shorter, missing, or\nempty bound column renders empty cells for the remaining rows."}},"required":["label","align","source","smartValueKey"],"additionalProperties":false}]},"description":"The table's columns, left to right. They all share the table's row count;\neach column's `source` decides where its own body cells come from."},"tableRowCount":{"type":"integer","minimum":1,"maximum":50,"description":"How many body rows to render when no column is bound to a smart value. When\none is, the longest bound array sets the row count instead, except that this\nstays a lower bound for as long as any column's `source` is 'literal', so\nbinding one column can't drop cells authored in another. This is the table's\nown row count, unrelated to the section's grid rows."},"tableShowHeader":{"type":"boolean","description":"Whether to render a header row of the columns' labels above the body rows."},"tableFontSize":{"type":"integer","minimum":9,"maximum":24,"description":"Size of the text in every cell, header and body alike, in pixels."},"tableHeaderTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the header cells' text. Only visible when `tableShowHeader` is true."},"tableBodyTextColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the body cells' text."},"tableHeaderFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the header cells. Only visible when `tableShowHeader` is true."},"tableBodyFillColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Fill behind the body cells. Distinct from `background`, which fills the whole footprint behind the table."},"tableBorderColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"Color of the grid lines drawn between and around the cells. Set it to match\n`tableBodyFillColor` for a table with no visible grid."}},"required":["id","padding","layout","type","tableColumns","tableRowCount","tableShowHeader","tableFontSize","tableHeaderTextColor","tableBodyTextColor","tableHeaderFillColor","tableBodyFillColor","tableBorderColor"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"padding":{"default":{"top":0,"bottom":0,"left":0,"right":0},"description":"Padding in pixels, applied inside the element's cell box (does not affect\ncolumn width).","type":"object","properties":{"top":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"bottom":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"left":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"right":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["top","bottom","left","right"],"additionalProperties":false},"background":{"description":"Omitting an element's background results in a transparent background.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]},"layout":{"type":"object","additionalProperties":{"type":"object","properties":{"row":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based row index, where 0 is the section's top row."},"col":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"0-based column index, where 0 is the section's leftmost column."},"rowSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"colSpan":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["row","col","rowSpan","colSpan"],"additionalProperties":false},"description":"A layout for each breakpoint supported by the current medium. Only one needs\nto be set upon inserting an element, the remaining layouts will be seeded\nbased on reading order."},"type":{"type":"string","enum":["qrCode"]},"qrValue":{"description":"What the code encodes, absent until the user sets it. A QR code element can\nbe placed and resized before it has any payload.","oneOf":[{"type":"object","properties":{"source":{"type":"string","enum":["literal"]},"value":{"type":"string","minLength":1,"maxLength":512,"description":"The exact text to encode. It does not have to be a URL: a ticket ID that\ndoor staff scan is equally valid. Braces carry no meaning here, thus\n'{{order.id}}' encodes those 12 characters. Bind the element to a smart\nvalue instead to encode a per-recipient value."}},"required":["source","value"],"additionalProperties":false},{"type":"object","properties":{"source":{"type":"string","enum":["smartValue"]},"smartValueKey":{"type":"string","minLength":1,"description":"The bare key of a scalar smart value ('order.id', not '{{order.id}}'),\nresolved at render time to give the payload. Each recipient thus gets a\ndifferent code. A missing or empty value renders no code at all."}},"required":["source","smartValueKey"],"additionalProperties":false}]},"alt":{"type":"string","description":"Alternative text describing the code, read by screen readers and shown by\nclients which block images. Say what the code is for ('Your ticket'), since\nthe payload itself is not useful to a person."},"horizontalAlign":{"type":"string","enum":["left","center","right"],"description":"Where the code sits horizontally when it is narrower than the space\navailable to it."},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"description":"Where the code sits vertically when it is shorter than the space available\nto it."}},"required":["id","padding","layout","type","alt","horizontalAlign","verticalAlign"],"additionalProperties":false}]}},"rows":{"type":"object","additionalProperties":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"Sections have different numbers of rows for each breakpoint supported by the\ncurrent medium, e.g. so sections can be taller in narrower breakpoints."},"background":{"description":"Omitting a section's background results in a transparent background,\nrevealing the page background behind it.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}]}},"required":["id","elements","rows"],"additionalProperties":false}},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["color"]},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","description":"A 6-digit hexadecimal color with \"#\" prefix"}},"required":["type","color"],"additionalProperties":false}],"description":"For media with a fixed width (email), this determines the background color\noutside of the letterboxed area. For other media which scales to fill the\nviewport, it will only be visible where it isn't obstructed by a section's\nbackground. Backgrounds are mandatory for pages."},"schemaVersion":{"type":"number","enum":[1]},"revisionCount":{"type":"number"}},"required":["id","hostId","name","medium","sections","background","schemaVersion","revisionCount"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/prices/":{"get":{"summary":"List Prices","tags":["Prices"],"description":"Lists the host's prices, optionally filtered by product, type, or active status. Sorted by creation date descending. Paginated.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false,"description":"Page number (0-based, default 0)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 100)"},{"schema":{"type":"string"},"in":"query","name":"productId","required":false,"description":"Filter by parent product"},{"schema":{"type":"string","enum":["recurring","one_time"]},"in":"query","name":"type","required":false,"description":"Filter by cadence; omit to include all"},{"schema":{"type":"boolean"},"in":"query","name":"active","required":false,"description":"When set, returns only active or only archived prices"},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, hostId, productId, type, currency, unitAmount, nickname, active, createdAt, updatedAt. Omit for all fields."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"productId":{"type":"string","description":"The Product this Price applies to"},"type":{"type":"string","enum":["recurring","one_time"],"description":"Price cadence.\n- recurring: billed on a fixed cadence (subscription-backed)\n- one_time: single charge, typically used for add-on / top-up packs"},"currency":{"type":"string","enum":["USD","CAD"]},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit cost in minor units (cents for USD)"},"recurring":{"type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"],"additionalProperties":false},"features":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"],"additionalProperties":false}]}},"nickname":{"description":"Admin-facing display label","type":"string"},"active":{"type":"boolean","description":"Soft-archive flag. Inactive prices cannot back new subscriptions"},"metadata":{"description":"Free-form key/value tags for integrations","type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Price","tags":["Prices"],"description":"Creates a Price for a Product. The Price defines cadence (one_time or recurring), per-unit cost, and an optional array of typed Feature grants (boolean, quantity, enum, duration).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"productId":{"type":"string","description":"Parent product this price applies to"},"type":{"type":"string","enum":["recurring","one_time"],"description":"Price cadence.\n- recurring: billed on a fixed cadence (subscription-backed)\n- one_time: single charge, typically used for add-on / top-up packs"},"currency":{"type":"string","enum":["USD","CAD"]},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit cost in minor units"},"recurring":{"description":"Required when type=recurring; forbidden when type=one_time","type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"]},"features":{"description":"Feature grants on this Price. Each entry references a Feature in the catalog by `featureKey`. Quantity grants drive Entitlement balance refills on subscription renewal; non-quantity grants are resolved live.","type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"]},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"]},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"]},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"]}]}},"nickname":{"type":"string"},"metadata":{"type":"object","additionalProperties":{"type":"string"}}},"required":["productId","type","currency","unitAmount"]}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"productId":{"type":"string","description":"The Product this Price applies to"},"type":{"type":"string","enum":["recurring","one_time"],"description":"Price cadence.\n- recurring: billed on a fixed cadence (subscription-backed)\n- one_time: single charge, typically used for add-on / top-up packs"},"currency":{"type":"string","enum":["USD","CAD"]},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit cost in minor units (cents for USD)"},"recurring":{"type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"],"additionalProperties":false},"features":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"],"additionalProperties":false}]}},"nickname":{"description":"Admin-facing display label","type":"string"},"active":{"type":"boolean","description":"Soft-archive flag. Inactive prices cannot back new subscriptions"},"metadata":{"description":"Free-form key/value tags for integrations","type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/prices/{id}":{"get":{"summary":"Get Price","tags":["Prices"],"description":"Retrieves a single Price by id.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, hostId, productId, type, currency, unitAmount, recurring, features, nickname, active, metadata, createdAt, updatedAt. Omit for all fields."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Price id, discoverable via list_prices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"productId":{"type":"string","description":"The Product this Price applies to"},"type":{"type":"string","enum":["recurring","one_time"],"description":"Price cadence.\n- recurring: billed on a fixed cadence (subscription-backed)\n- one_time: single charge, typically used for add-on / top-up packs"},"currency":{"type":"string","enum":["USD","CAD"]},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit cost in minor units (cents for USD)"},"recurring":{"type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"],"additionalProperties":false},"features":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"],"additionalProperties":false}]}},"nickname":{"description":"Admin-facing display label","type":"string"},"active":{"type":"boolean","description":"Soft-archive flag. Inactive prices cannot back new subscriptions"},"metadata":{"description":"Free-form key/value tags for integrations","type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Price","tags":["Prices"],"description":"Applies a partial update to a Price. Mutable fields: unitAmount, recurring, features, nickname, metadata. To switch type/currency/product, archive and create a new Price.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991},"recurring":{"type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"]},"features":{"description":"Pass null to clear; omit to preserve","type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"]},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"]},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"]},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"]}]},"nullable":true},"nickname":{"description":"Pass null to clear; omit to preserve","type":"string","nullable":true},"metadata":{"description":"Pass null to clear; omit to preserve","type":"object","additionalProperties":{"type":"string"},"nullable":true}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Price id, discoverable via list_prices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"productId":{"type":"string","description":"The Product this Price applies to"},"type":{"type":"string","enum":["recurring","one_time"],"description":"Price cadence.\n- recurring: billed on a fixed cadence (subscription-backed)\n- one_time: single charge, typically used for add-on / top-up packs"},"currency":{"type":"string","enum":["USD","CAD"]},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit cost in minor units (cents for USD)"},"recurring":{"type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"],"additionalProperties":false},"features":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"],"additionalProperties":false}]}},"nickname":{"description":"Admin-facing display label","type":"string"},"active":{"type":"boolean","description":"Soft-archive flag. Inactive prices cannot back new subscriptions"},"metadata":{"description":"Free-form key/value tags for integrations","type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/prices/{id}/archive":{"post":{"summary":"Archive Price","tags":["Prices"],"description":"Soft-archives a Price. Idempotent. Existing subscriptions are unaffected; new subscriptions cannot select this Price until unarchived.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Price id, discoverable via list_prices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"productId":{"type":"string","description":"The Product this Price applies to"},"type":{"type":"string","enum":["recurring","one_time"],"description":"Price cadence.\n- recurring: billed on a fixed cadence (subscription-backed)\n- one_time: single charge, typically used for add-on / top-up packs"},"currency":{"type":"string","enum":["USD","CAD"]},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit cost in minor units (cents for USD)"},"recurring":{"type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"],"additionalProperties":false},"features":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"],"additionalProperties":false}]}},"nickname":{"description":"Admin-facing display label","type":"string"},"active":{"type":"boolean","description":"Soft-archive flag. Inactive prices cannot back new subscriptions"},"metadata":{"description":"Free-form key/value tags for integrations","type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/prices/{id}/unarchive":{"post":{"summary":"Unarchive Price","tags":["Prices"],"description":"Restores an archived Price. Idempotent.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Price id, discoverable via list_prices"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"productId":{"type":"string","description":"The Product this Price applies to"},"type":{"type":"string","enum":["recurring","one_time"],"description":"Price cadence.\n- recurring: billed on a fixed cadence (subscription-backed)\n- one_time: single charge, typically used for add-on / top-up packs"},"currency":{"type":"string","enum":["USD","CAD"]},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit cost in minor units (cents for USD)"},"recurring":{"type":"object","properties":{"interval":{"type":"string","enum":["day","week","month","year"],"description":"Cadence unit"},"intervalCount":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Positive integer multiplier on interval (e.g. 3 with month = \"every three months\")"}},"required":["interval","intervalCount"],"additionalProperties":false},"features":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["boolean"]},"enabled":{"type":"boolean"}},"required":["featureKey","type","enabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["quantity"]},"quantity":{"description":"null = unlimited","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true},"rolloverEnabled":{"type":"boolean"},"rolloverCap":{"type":"integer","minimum":1,"maximum":9007199254740991},"expireOnCancel":{"type":"boolean"}},"required":["featureKey","type","quantity","rolloverEnabled"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["enum"]},"enumValue":{"type":"string"}},"required":["featureKey","type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"featureKey":{"type":"string"},"type":{"type":"string","enum":["duration"]},"durationDays":{"description":"null = unlimited / \"all time\"","type":"integer","minimum":1,"maximum":9007199254740991,"nullable":true}},"required":["featureKey","type","durationDays"],"additionalProperties":false}]}},"nickname":{"description":"Admin-facing display label","type":"string"},"active":{"type":"boolean","description":"Soft-archive flag. Inactive prices cannot back new subscriptions"},"metadata":{"description":"Free-form key/value tags for integrations","type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/properties/":{"get":{"summary":"List Properties","tags":["Properties"],"description":"Fetch a list of properties belonging to the user. The returned results are\npaginated. Results can be filtered by status, object type, or property type,\nand can be sorted by several fields. `search` performs a case-insensitive\nmatch against the property name.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string","enum":["event","order","ticket","contact"]},"in":"query","name":"objectType","required":false,"description":"Filter by the type of object this property belongs to."},{"schema":{"type":"string","enum":["Text","Multi-line Text","Number","Select One","Yes/No","Select Multiple","Date","File","Email","Phone"]},"in":"query","name":"propertyType","required":false,"description":"Filter by property data type."},{"schema":{"type":"string","enum":["active","archived"]},"in":"query","name":"status","required":false,"description":"Filter by property status."},{"schema":{"default":"name","type":"string","enum":["name","description","type","objectType","status"]},"in":"query","name":"sort","required":false},{"schema":{"default":"asc","type":"string","enum":["asc","desc"]},"in":"query","name":"order","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Searches property names, case-insensitive."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"hasMore":{"type":"boolean","description":"If true, there are more pages of results available."},"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Number"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Date"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["File"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Email"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false}]}}},"required":["hasMore","data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Property","tags":["Properties"],"description":"Create a new property. Note that \"type\" and \"objectType\" can ONLY be set\nwhen creating the property and CANNOT be modified!\nReturns the created property, which will have an ID generated for it.\nFor 'Select One' and 'Select Multiple' types, `options` is required and\nmust have at least one entry.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["Text","Multi-line Text","Number","Select One","Yes/No","Select Multiple","Date","File","Email","Phone"]},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"},"options":{"description":"Exists if and only if `type` is \"Select One\" or \"Select Multiple\".","type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"]}}},"required":["type","name","status","objectType"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Number"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Date"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["File"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Email"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/properties/{id}":{"get":{"summary":"Get Property","tags":["Properties"],"description":"Fetch a single property by its ID.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"The ID of the property."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Number"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Date"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["File"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Email"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false}]}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Edit Property","tags":["Properties"],"description":"Edit the property with the given ID. Note that \"type\" and \"objectType\"\ncannot be modified on existing properties. Only fields included in `updates`\nwill be modified, other fields will be left unchanged. `description` can be\nset to null to remove it entirely. To retire a property, set `status` to\n\"archived\". Properties cannot be fully deleted to preserve referential\nintegrity.\nWARNING: for \"Select One\" and \"Select Multiple\" properties, an option's\n`value` is the identity that gets persisted on every instance that selected\nit (e.g. a contact). Changing an existing option's `value` does NOT migrate\nthose instances, so they keep the old value and no longer match any option.\nIn this case, the UI would show the raw stored value instead of a label.\nRename an option by changing its `label` only; change a `value`\nonly if no existing instances use the old one.\nReturns the full property after the update is applied.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"options":{"description":"Exists if and only if `type` is \"Select One\" or \"Select Multiple\".","type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"]}},"description":{"description":"Optional information about this property.","type":"string","nullable":true}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"The ID of the property."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Multi-line Text"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Number"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select One"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Yes/No"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"The value stored when this option is selected."},"label":{"type":"string","description":"The display label for this option."}},"required":["value","label"],"additionalProperties":false}},"type":{"type":"string","enum":["Select Multiple"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["options","type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Date"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["File"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Email"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["Phone"]},"id":{"type":"string","description":"This property's unique ID."},"name":{"type":"string","description":"The property's name. Must be unique among other properties for the same\n`objectType` (case-insensitive)."},"description":{"description":"Optional information about this property.","type":"string"},"status":{"type":"string","enum":["active","archived"],"description":"Determines where this property can be used. \"archived\" properties are\nsoft-deleted (any existing reference to them remains valid) but only \"active\"\nproperties should be used in new workflows, forms, etc."},"objectType":{"type":"string","enum":["event","order","ticket","contact"],"description":"The type of object this property belongs to.\n- event: properties on events\n- order: properties on orders (buyer-level)\n- ticket: properties on individual products within an order (tickets, add-ons, etc.)\n- contact: properties on customer contact records"}},"required":["type","id","name","status","objectType"],"additionalProperties":false}]}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/referrals/":{"get":{"summary":"List Referrals","tags":["Referrals"],"description":"Lists the workspace's referral links with view / revenue / ticket\ntotals per row.\nRender rows using these precomputed fields — don't reformat the\nraw ones:\n- 'display_name'   — name column. Never show 'label' directly.\n- 'category_label' — kind column. e.g. \"Newsletter tracking link\",\n\"Event tracking link\", \"Meta Pixel\".\n- 'event_name'     — event title when the referral points at an event.\n- 'newsletter_subject' - email subject (email referrals only).\nOptional filters: event_id, type, newsletter_tracking_links.","parameters":[{"schema":{"type":"string"},"in":"query","name":"event_id","required":false,"description":"Narrow to one event"},{"schema":{"type":"string","enum":["user","event","facebook-pixel"]},"in":"query","name":"type","required":false,"description":"Narrow to one referral type"},{"schema":{"type":"boolean"},"in":"query","name":"newsletter_tracking_links","required":false,"description":"true: only email-generated referrals.\nfalse: only manual referrals.\nomit: both."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"label":{"type":"string"},"type":{"type":"string","enum":["user","event","facebook-pixel"],"description":"Referral kind.\n- user: generic per-host link (rare today)\n- event: tied to one event id; revenue join keys off these\n- facebook-pixel: fb pixel association, no view tracking"},"event_id":{"type":"string"},"pixel_id":{"type":"string"},"apply_to_all_events":{"type":"boolean"},"newsletter_tracking_links":{"description":"True when this referral was generated by the email send flow","type":"boolean"},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"},"views":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Count of view rows attached to this referral"},"revenue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of purchase view value, in cents"},"tickets":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of purchase view ticket qty"},"event_name":{"description":"Resolved event title for event referrals. Absent when the event was deleted or never existed.","type":"string"},"newsletter_subject":{"description":"Resolved email subject when newsletter_tracking_links=true (the label IS the email id). Absent when the email was deleted.","type":"string"},"category":{"type":"string","enum":["newsletter","event","facebook-pixel","user"],"description":"Machine-readable classification. For user-facing rendering use\n'category_label' instead. Derived from type + newsletter_tracking_links:\n- \"newsletter\":     link auto-created by an email send (type='event' AND newsletter_tracking_links=true)\n- \"event\":          manual per-event tracking link\n- \"facebook-pixel\": Meta pixel\n- \"user\":           legacy per-host link"},"category_label":{"type":"string","description":"Pre-formatted human-readable category. ALWAYS use this when\nrendering the row's kind to a user — don't reformat 'category'\nyourself.\n- \"Newsletter tracking link\"\n- \"Event tracking link\"\n- \"Meta Pixel\"\n- \"User tracking link\""},"display_name":{"type":"string","description":"Human-readable name for this referral. ALWAYS use this when rendering the\nreferral to a user, NEVER show 'label' directly, because for email referrals\nit's the email ID (an opaque ID). Resolution:\n- email referrals: newsletter_subject (or \"(deleted newsletter)\" when the email was removed)\n- facebook-pixel: pixel_id (or label when pixel_id missing)\n- event / user: label"}},"required":["id","hostId","label","type","createdAt","updatedAt","views","revenue","tickets","category","category_label","display_name"],"additionalProperties":false}},"totalViews":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["data"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Referral","tags":["Referrals"],"description":"Creates a referral link. For type=\"event\", supply event_id; for\ntype=\"facebook-pixel\", supply pixel_id. Do not set\nnewsletter_tracking_links - the b2b email-send flow sets that\nserver-side when it creates the referrals for an event-block.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","description":"Display label. For email referrals this is the email id."},"type":{"type":"string","enum":["user","event","facebook-pixel"],"description":"Referral kind.\n- user: generic per-host link (rare today)\n- event: tied to one event id; revenue join keys off these\n- facebook-pixel: fb pixel association, no view tracking"},"event_id":{"description":"Required for type=\"event\". Scopes the referral to one event.","type":"string"},"pixel_id":{"description":"Required for type=\"facebook-pixel\". The pixel id.","type":"string"},"apply_to_all_events":{"description":"When true, this referral applies to every event on the host (rather than just event_id).","type":"boolean"},"newsletter_tracking_links":{"description":"Server-set by the /b2b/email/:id/referrals flow; clients should not set this.","type":"boolean"}},"required":["label","type"]}}}},"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"label":{"type":"string"},"type":{"type":"string","enum":["user","event","facebook-pixel"],"description":"Referral kind.\n- user: generic per-host link (rare today)\n- event: tied to one event id; revenue join keys off these\n- facebook-pixel: fb pixel association, no view tracking"},"event_id":{"type":"string"},"pixel_id":{"type":"string"},"apply_to_all_events":{"type":"boolean"},"newsletter_tracking_links":{"description":"True when this referral was generated by the email send flow","type":"boolean"},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"}},"required":["id","hostId","label","type","createdAt","updatedAt"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/referrals/{id}":{"get":{"summary":"Get Referral","tags":["Referrals"],"description":"Retrieves a single referral by id, including its computed metrics.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Referral id, discoverable via list_referrals"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"label":{"type":"string"},"type":{"type":"string","enum":["user","event","facebook-pixel"],"description":"Referral kind.\n- user: generic per-host link (rare today)\n- event: tied to one event id; revenue join keys off these\n- facebook-pixel: fb pixel association, no view tracking"},"event_id":{"type":"string"},"pixel_id":{"type":"string"},"apply_to_all_events":{"type":"boolean"},"newsletter_tracking_links":{"description":"True when this referral was generated by the email send flow","type":"boolean"},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"},"views":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Count of view rows attached to this referral"},"revenue":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of purchase view value, in cents"},"tickets":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Sum of purchase view ticket qty"},"event_name":{"description":"Resolved event title for event referrals. Absent when the event was deleted or never existed.","type":"string"},"newsletter_subject":{"description":"Resolved email subject when newsletter_tracking_links=true (the label IS the email id). Absent when the email was deleted.","type":"string"},"category":{"type":"string","enum":["newsletter","event","facebook-pixel","user"],"description":"Machine-readable classification. For user-facing rendering use\n'category_label' instead. Derived from type + newsletter_tracking_links:\n- \"newsletter\":     link auto-created by an email send (type='event' AND newsletter_tracking_links=true)\n- \"event\":          manual per-event tracking link\n- \"facebook-pixel\": Meta pixel\n- \"user\":           legacy per-host link"},"category_label":{"type":"string","description":"Pre-formatted human-readable category. ALWAYS use this when\nrendering the row's kind to a user — don't reformat 'category'\nyourself.\n- \"Newsletter tracking link\"\n- \"Event tracking link\"\n- \"Meta Pixel\"\n- \"User tracking link\""},"display_name":{"type":"string","description":"Human-readable name for this referral. ALWAYS use this when rendering the\nreferral to a user, NEVER show 'label' directly, because for email referrals\nit's the email ID (an opaque ID). Resolution:\n- email referrals: newsletter_subject (or \"(deleted newsletter)\" when the email was removed)\n- facebook-pixel: pixel_id (or label when pixel_id missing)\n- event / user: label"}},"required":["id","hostId","label","type","createdAt","updatedAt","views","revenue","tickets","category","category_label","display_name"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Referral","tags":["Referrals"],"description":"Permanently deletes a referral. View rows referencing it stay (revenue history is preserved).","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Referral id, discoverable via list_referrals"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/referrals/{id}/views":{"get":{"summary":"List Referral Activity","tags":["Referrals"],"description":"Lists the View rows attached to one referral — link clicks (type=\"ref\")\nand ticket purchases (type=\"purchase\"). Sorted newest first.","parameters":[{"schema":{"type":"string"},"in":"query","name":"event_id","required":false,"description":"Narrow to one event"},{"schema":{"type":"string","enum":["ref","purchase","view"]},"in":"query","name":"type","required":false,"description":"Narrow to one view type"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Referral id, discoverable via list_referrals"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["ref","purchase","view"],"description":"View row type.\n- ref:      counted hit on a referral link\n- view:     general event-page view (no ref_id)\n- purchase: ticket purchase that came through this referral"},"ref_id":{"type":"string"},"event_id":{"type":"string"},"hour":{"type":"number"},"hashes":{"type":"array","items":{"type":"string"}},"value":{"type":"number"},"tickets":{"type":"number"},"order_id":{"type":"string"},"createdAt":{"type":"number"},"updatedAt":{"type":"number"}},"required":["id","type","hour","createdAt","updatedAt"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/segments/by-member/{memberId}":{"get":{"summary":"Get Member Memberships","tags":["Segments"],"description":"Lists every segment that contains a given member (optionally filtered by target type).","parameters":[{"schema":{"type":"string","enum":["contact","order","ticket"]},"in":"query","name":"targetType","required":false},{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"memberId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"segments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"targetType":{"type":"string","enum":["contact","order","ticket"]},"kind":{"type":"string","enum":["active","static"]},"filters":{"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"formId":{"type":"string"},"folderId":{"type":"string"},"status":{"type":"string","enum":["active","archived"]},"trackMembershipEvents":{"type":"boolean"},"refreshIntervalMs":{"type":"number"},"lastRefreshedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"refreshingUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"memberCount":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","ownerId","name","targetType","kind","filters","status","trackMembershipEvents","createdAt","updatedAt"],"additionalProperties":false}}},"required":["segments"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/segments/":{"get":{"summary":"List Segments","tags":["Segments"],"description":"Workspace-scoped paginated list. Supports targetType / folderId\n/ status / search and the same JSON filter expression contacts\nlist accepts. Pass `folderId='unfiled'` to scope to segments\nthat have no folder set.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":200},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string","enum":["name","createdAt","updatedAt","lastRefreshedAt","memberCount","targetType"]},"in":"query","name":"sortField","required":false},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false},{"schema":{"type":"string","enum":["contact","order","ticket"]},"in":"query","name":"targetType","required":false},{"schema":{"anyOf":[{"type":"string","pattern":"^[a-f0-9]{24}$"},{"type":"string","enum":["unfiled"]}]},"in":"query","name":"folderId","required":false},{"schema":{"type":"string","enum":["active","archived"]},"in":"query","name":"status","required":false},{"schema":{"type":"string"},"in":"query","name":"filters","required":false}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"targetType":{"type":"string","enum":["contact","order","ticket"]},"kind":{"type":"string","enum":["active","static"]},"filters":{"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"formId":{"type":"string"},"folderId":{"type":"string"},"status":{"type":"string","enum":["active","archived"]},"trackMembershipEvents":{"type":"boolean"},"refreshIntervalMs":{"type":"number"},"lastRefreshedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"refreshingUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"memberCount":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","ownerId","name","targetType","kind","filters","status","trackMembershipEvents","createdAt","updatedAt"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"pageNumber":{"type":"number"},"pageSize":{"type":"number"}},"required":["data","hasMore","pageNumber","pageSize"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Segment","tags":["Segments"],"description":"Creates a segment. `name` is unique within\n(targetType). Duplicates → 409 with `error.details.conflictingId`.\nEmpty filter rejected with 422.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"targetType":{"type":"string","enum":["contact","order","ticket"]},"kind":{"type":"string","enum":["active","static"]},"filters":{"minItems":1,"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"formId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"folderId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"status":{"default":"active","type":"string","enum":["active","archived"]},"trackMembershipEvents":{"default":true,"type":"boolean"},"refreshIntervalMs":{"type":"integer","minimum":60000,"maximum":9007199254740991}},"required":["name","targetType","kind","filters"]}},"required":["input"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"segment":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"targetType":{"type":"string","enum":["contact","order","ticket"]},"kind":{"type":"string","enum":["active","static"]},"filters":{"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"formId":{"type":"string"},"folderId":{"type":"string"},"status":{"type":"string","enum":["active","archived"]},"trackMembershipEvents":{"type":"boolean"},"refreshIntervalMs":{"type":"number"},"lastRefreshedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"refreshingUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"memberCount":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","ownerId","name","targetType","kind","filters","status","trackMembershipEvents","createdAt","updatedAt"],"additionalProperties":false}},"required":["segment"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/segments/{id}":{"get":{"summary":"Get Segment","tags":["Segments"],"description":"Fetch a segment by id. 404 if absent or owned by another workspace.","parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Segment id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"segment":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"targetType":{"type":"string","enum":["contact","order","ticket"]},"kind":{"type":"string","enum":["active","static"]},"filters":{"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"formId":{"type":"string"},"folderId":{"type":"string"},"status":{"type":"string","enum":["active","archived"]},"trackMembershipEvents":{"type":"boolean"},"refreshIntervalMs":{"type":"number"},"lastRefreshedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"refreshingUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"memberCount":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","ownerId","name","targetType","kind","filters","status","trackMembershipEvents","createdAt","updatedAt"],"additionalProperties":false}},"required":["segment"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Segment","tags":["Segments"],"description":"Patches a segment. `targetType` is immutable; passing it is\na type-level error. Renames may collide → 409.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"update":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"filters":{"minItems":1,"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"folderId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"trackMembershipEvents":{"type":"boolean"},"refreshIntervalMs":{"type":"integer","minimum":60000,"maximum":9007199254740991}},"additionalProperties":false}},"required":["update"]}}}},"parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Segment id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"segment":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"targetType":{"type":"string","enum":["contact","order","ticket"]},"kind":{"type":"string","enum":["active","static"]},"filters":{"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"formId":{"type":"string"},"folderId":{"type":"string"},"status":{"type":"string","enum":["active","archived"]},"trackMembershipEvents":{"type":"boolean"},"refreshIntervalMs":{"type":"number"},"lastRefreshedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"refreshingUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"memberCount":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","ownerId","name","targetType","kind","filters","status","trackMembershipEvents","createdAt","updatedAt"],"additionalProperties":false}},"required":["segment"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Delete Segment","tags":["Segments"],"description":"Soft-deletes the segment. Membership rows are preserved (hard-cleanup is admin-only).","parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Segment id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-f0-9]{24}$"},"deleted":{"type":"boolean"}},"required":["id","deleted"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/segments/{id}/convert-to-static":{"post":{"summary":"Convert segment to static","tags":["Segments"],"description":"Freezes the current membership and stops filter-driven recompute. Equivalent to HubSpot's schedule-conversion endpoint, applied synchronously.","parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Segment id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"segment":{"type":"object","properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"targetType":{"type":"string","enum":["contact","order","ticket"]},"kind":{"type":"string","enum":["active","static"]},"filters":{"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}},"formId":{"type":"string"},"folderId":{"type":"string"},"status":{"type":"string","enum":["active","archived"]},"trackMembershipEvents":{"type":"boolean"},"refreshIntervalMs":{"type":"number"},"lastRefreshedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"refreshingUntil":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"memberCount":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","ownerId","name","targetType","kind","filters","status","trackMembershipEvents","createdAt","updatedAt"],"additionalProperties":false}},"required":["segment"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/segments/{id}/members":{"get":{"summary":"List Segment Members","tags":["Segments"],"description":"Paginated members of a segment. Defaults sort `joinedAt` desc.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":200},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string"},"in":"query","name":"sortField","required":false},{"schema":{"default":"desc","type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false},{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Segment id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"segmentId":{"type":"string"},"memberId":{"type":"string"},"joinedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["segmentId","memberId","joinedAt"],"additionalProperties":{}}},"hasMore":{"type":"boolean"},"pageNumber":{"type":"number"},"pageSize":{"type":"number"}},"required":["data","hasMore","pageNumber","pageSize"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Bulk-add members (static segments)","tags":["Segments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"memberIds":{"minItems":1,"maxItems":100000,"type":"array","items":{"type":"string","pattern":"^[a-f0-9]{24}$"}}},"required":["memberIds"]}}}},"parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Segment id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"matchedCount":{"type":"number"},"insertedCount":{"type":"number"},"memberCount":{"type":"number"}},"required":["matchedCount","insertedCount","memberCount"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/segments/{id}/members/from-filter":{"post":{"summary":"Bulk-add members by filter result","tags":["Segments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fromFilter":{"minItems":1,"type":"array","items":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","items":{}}},"required":["logic","conditions"],"additionalProperties":{}}}},"required":["fromFilter"]}}}},"parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true,"description":"Segment id."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"matchedCount":{"type":"number"},"insertedCount":{"type":"number"},"memberCount":{"type":"number"}},"required":["matchedCount","insertedCount","memberCount"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/segments/{id}/members/{memberId}":{"post":{"summary":"Add Segment Member","tags":["Segments"],"description":"Adds a member to a static segment. No-op if already present (returns `inserted: false`).","parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true},{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"memberId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"inserted":{"type":"boolean"},"memberCount":{"type":"number"}},"required":["inserted","memberCount"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"summary":"Remove Segment Member","tags":["Segments"],"description":"Removes a member from a static segment.","parameters":[{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"id","required":true},{"schema":{"type":"string","pattern":"^[a-f0-9]{24}$"},"in":"path","name":"memberId","required":true}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"},"memberCount":{"type":"number"}},"required":["removed","memberCount"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/":{"get":{"summary":"List Subscriptions","tags":["Subscriptions"],"description":"Lists the host's subscriptions. Filterable by status, contact, or Price. Sorted by creation date desc. Paginated.","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false,"description":"Page number (0-based)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 100)"},{"schema":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"]},"in":"query","name":"status","required":false,"description":"Filter by status"},{"schema":{"type":"string"},"in":"query","name":"contactId","required":false,"description":"Filter by recipient contact id"},{"schema":{"type":"string"},"in":"query","name":"priceId","required":false,"description":"Filter by Price reference"},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, hostId, contactId, customerEmail, priceId, quantity, status, currentPeriodStart, currentPeriodEnd, trialStart, trialEnd, billingCycleAnchor, cancelAt, cancelAtPeriodEnd, canceledAt, endedAt, startedAt, dunningEnabled, autoCharge, nextRetryAt, retryCount, nextCycleDiscount, createdAt, updatedAt. Omit for all."}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"summary":"Create Subscription","tags":["Subscriptions"],"description":"Creates a new subscription against an active recurring Price. Starts in `trialing` if trialDays is set, else `incomplete` (awaiting first payment).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"priceId":{"description":"Single-item shortcut. Use this OR `items[]`. Must be active + recurring.","type":"string"},"quantity":{"description":"Number of units of the priceId shortcut (default 1).","type":"integer","minimum":1,"maximum":9007199254740991},"items":{"description":"Multi-item path. Each item references a recurring Price; all items must share the same recurring cycle and currency (Phase 1).","type":"array","items":{"type":"object","properties":{"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["priceId"]}},"contactId":{"description":"CRM contact id; optional if customerEmail provided","type":"string"},"customerEmail":{"description":"Email for late linking when contactId is unknown","type":"string"},"trialDays":{"description":"Trial length in days; omit/0 for no trial. Mutually exclusive with billingCycleAnchor.","type":"integer","minimum":0,"maximum":9007199254740991},"billingCycleAnchor":{"description":"Absolute first-billing date; when set (and in the future), the first paid cycle begins on this date and the sub is in trialing until then. Mutually exclusive with trialDays.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on the renewal pass once now >= cancelAt.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"description":"Defaults to true. When false, a failed renewal payment marks the subscription unpaid immediately with no past-due grace or automatic retries.","type":"boolean"},"notes":{"description":"Memo printed on every renewal invoice generated for this subscription.","type":"string","maxLength":5000},"taxIds":{"description":"Host tax-ID snapshot. Forwarded onto each renewal invoice unchanged.","maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","maxLength":50},"value":{"type":"string","maxLength":100}},"required":["type","value"]}},"autoCharge":{"description":"Defaults to true. When false, the scheduler stops at finalize and the customer pays each renewal invoice via the emailed payment link.","type":"boolean"},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false. Each renewal's dueAt = renewalDate + paymentDueDays.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal. Persisted on the sub; the scheduler applies it on each renewal.","type":"number","minimum":0,"maximum":100},"metadata":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}":{"get":{"summary":"Get Subscription","tags":["Subscriptions"],"description":"Retrieves a single subscription by id.","parameters":[{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields. Valid: id, hostId, contactId, customerEmail, priceId, quantity, items, status, currentPeriodStart, currentPeriodEnd, trialStart, trialEnd, billingCycleAnchor, cancelAt, cancelAtPeriodEnd, canceledAt, cancelReason, endedAt, startedAt, dunningEnabled, autoCharge, paymentDueDays, taxRate, notes, taxIds, firstFailureAt, nextRetryAt, retryCount, nextCycleDiscount, metadata, createdAt, updatedAt. Omit for all."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"summary":"Update Subscription (mid-cycle change with proration)","tags":["Subscriptions"],"description":"Changes a subscription's priceId and/or quantity mid-cycle and issues a Stripe-style daily-prorated invoice for the rate difference. Allowed on active or trialing subs only (trialing skips proration entirely — the new price takes effect at trial end). The new price must be active, recurring, and the same currency as the current one. Downgrades that net <= 0 apply without generating a credit invoice (v1 has no credit balance — the customer simply pays less at next renewal).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"priceId":{"description":"Switch to this Price. Must be active, recurring, same currency.","type":"string"},"quantity":{"description":"New unit count. Must differ from the current quantity when priceId is unchanged.","type":"integer","minimum":1,"maximum":9007199254740991},"notes":{"description":"Memo carried onto future renewal invoices. Empty/whitespace clears.","type":"string","maxLength":5000},"taxIds":{"description":"Tax-ID snapshot forwarded onto future renewals.","maxItems":20,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","maxLength":50},"value":{"type":"string","maxLength":100}},"required":["type","value"]}},"taxRate":{"description":"Tax rate (percent) applied to renewal subtotals. 0 clears.","type":"number","minimum":0,"maximum":100},"autoCharge":{"description":"Flip auto-charge vs. manual-collection. Effective next renewal.","type":"boolean"},"dunningEnabled":{"description":"Smart-retry toggle for failed renewals.","type":"boolean"},"paymentDueDays":{"description":"Net-N-days for manual-collection invoices.","type":"integer","minimum":0,"maximum":9007199254740991}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["id","hostId","priceId","quantity","status","currentPeriodStart","currentPeriodEnd","cancelAtPeriodEnd","dunningEnabled","autoCharge","createdAt","updatedAt"],"additionalProperties":false},"invoice":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["id","status","total","currency"],"additionalProperties":false,"description":"Slim ref to the invoice generated by the renewal"},"proration":{"type":"object","properties":{"netAmountMinor":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Net adjustment in minor units. Positive = customer owes now; negative = unused value at the old rate (v1 does not credit)."},"daysRemaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"daysInCycle":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["netAmountMinor","daysRemaining","daysInCycle"],"additionalProperties":false,"description":"How the proration was computed for the active cycle"}},"required":["data","proration"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/manage-url":{"get":{"summary":"Get subscription manage URL","tags":["Subscriptions"],"description":"Returns a signed, customer-facing self-service portal URL for the\nsubscription, where the subscriber can view / cancel / resume it. The link\nis scoped to this one subscription; share it with the subscriber.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"url":{"type":"string","description":"Signed customer self-service portal URL for the subscription."}},"required":["url"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/activate":{"post":{"summary":"Activate Subscription","tags":["Subscriptions"],"description":"Transitions an incomplete or trialing subscription to active. Wired to first-payment-succeeded events by the payment processor; also exposed for manual activation.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/cancel":{"post":{"summary":"Cancel Subscription","tags":["Subscriptions"],"description":"Schedules cancel at the end of the current period. Access continues until currentPeriodEnd; the next renewal then transitions the subscription to canceled. Idempotent.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"description":"Free-form cancel reason","type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/cancel-immediately":{"post":{"summary":"Cancel Subscription Immediately","tags":["Subscriptions"],"description":"Admin override — terminates the subscription right now (status canceled, endedAt stamped). Refund handling is a separate concern.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/comp-next-cycle":{"post":{"summary":"Comp Subscription Next Cycle","tags":["Subscriptions"],"description":"Stages a one-time fully-free (100% off) next renewal cycle on the subscription. The next renewal consumes it exactly once, then bills normally. Rejected on a canceled/unpaid subscription.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/uncomp-next-cycle":{"post":{"summary":"Uncomp Subscription Next Cycle","tags":["Subscriptions"],"description":"Removes a staged \"comp next cycle\" from the subscription, so the next renewal bills at full price again. The inverse of comp_subscription_next_cycle. A no-op when no comp is pending; allowed on a subscription in any state.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/mark-unpaid":{"post":{"summary":"Mark Subscription Unpaid","tags":["Subscriptions"],"description":"Marks a subscription as unpaid (terminal). Admin override that bypasses dunning retries regardless of dunningEnabled. Called by payment processor webhooks for unrecoverable failures.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/bill":{"post":{"summary":"Bill Subscription Current Period","tags":["Subscriptions"],"description":"Generates a draft invoice for a subscription's current period without advancing the period. Used for the first-period invoice on a non-trial subscription, or one-off rebilling.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false},"invoice":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["id","status","total","currency"],"additionalProperties":false,"description":"Slim ref to the invoice generated by the renewal"}},"required":["data","invoice"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/upcoming":{"get":{"summary":"Preview Upcoming Subscription Invoice","tags":["Subscriptions"],"description":"Returns a non-persisted preview of the invoice the next renewal will generate (Stripe-style invoice.upcoming). Returns `invoice: null` when the subscription is set to cancel at period end. Rejects incomplete, canceled, and unpaid subscriptions (no future cycle exists to preview). For past_due subscriptions, the preview reflects the cycle AFTER the current retry, not the in-flight unpaid invoice itself. To inspect the current cycle's open invoice, use `list_invoices` with `subscriptionId` and `status: payment_failed`.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"invoice":{"type":"object","properties":{"customerId":{"type":"string"},"subscriptionId":{"type":"string"},"currency":{"type":"string"},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991},"unitAmount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Per-unit amount in minor units (cents)"},"productId":{"type":"string"},"priceId":{"type":"string"}},"required":["description","quantity","unitAmount"],"additionalProperties":false,"description":"Slim line-item shape: only the fields a preview needs"}},"subtotal":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Sum of line-item amounts in minor units"},"total":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Final amount the next renewal will bill, in minor units"},"periodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"periodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"required":["customerId","subscriptionId","currency","lineItems","subtotal","total","periodStart","periodEnd"],"additionalProperties":false,"description":"Non-persisted projection of the invoice the next renewal will generate.\nMirrors the persisted Invoice shape for the fields a caller needs to render\nthe upcoming charge. Omits id / number / status because nothing has been\nwritten yet.","nullable":true}},"required":["invoice"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/subscriptions/{id}/renew":{"post":{"summary":"Renew Subscription","tags":["Subscriptions"],"description":"Advances a subscription to its next billing period and generates an invoice. If cancelAtPeriodEnd was set, transitions to canceled instead. The Phase 4 scheduler will call this on cycle.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Subscription id, discoverable via list_subscriptions"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"contactId":{"description":"CRM contact id; optional until linked","type":"string"},"customerEmail":{"description":"Email; allows late-linking to a contact","type":"string"},"priceId":{"type":"string","description":"Primary item shortcut — mirrors items[0].priceId"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991,"description":"Primary item shortcut — mirrors items[0].quantity"},"items":{"description":"All billed lines on this subscription. Each item shares the parent sub's billing cycle (Phase 1).","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"priceId":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id","priceId","quantity"],"additionalProperties":false}},"status":{"type":"string","enum":["incomplete","trialing","active","past_due","canceled","unpaid"],"description":"Subscription lifecycle.\n- incomplete: created, awaiting first payment\n- trialing: in trial period\n- active: paying\n- past_due: renewal payment failed; scheduler is retrying per dunning policy\n- canceled: terminal — clean cancellation\n- unpaid: terminal — payment failed (retries exhausted or manual override), access revoked"},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"trialEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"billingCycleAnchor":{"description":"Absolute first-billing date; when set, the first paid cycle begins on this date","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAt":{"description":"Absolute scheduled end date; the sub auto-cancels on renewal once this date passes","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelAtPeriodEnd":{"type":"boolean","description":"When true, the next renewal will cancel instead of advancing"},"canceledAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"cancelReason":{"type":"string"},"endedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"startedAt":{"description":"When status first transitioned to active","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"dunningEnabled":{"type":"boolean","description":"When false, failed renewal payments mark the sub unpaid immediately (no retries)"},"firstFailureAt":{"description":"When the renewal payment first failed for the current past-due cycle","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"nextRetryAt":{"description":"When the dunning scheduler will attempt the next retry","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"retryCount":{"description":"Retries attempted on the current past-due cycle","type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"description":"Memo forwarded onto every renewal invoice","type":"string"},"taxIds":{"description":"Host tax-ID snapshot rolled forward onto each renewal invoice","type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"}},"required":["type","value"],"additionalProperties":false}},"autoCharge":{"type":"boolean","description":"When true (default), the scheduler attempts an off-session charge on renewal. When false, finalize stops at email-payment-link."},"paymentDueDays":{"description":"Days the customer has to pay each renewal invoice when autoCharge=false.","type":"integer","minimum":0,"maximum":9007199254740991},"taxRate":{"description":"Single tax rate (percent) applied to every renewal invoice subtotal.","type":"number","minimum":0,"maximum":100},"nextCycleDiscount":{"description":"One-time discount staged for the NEXT renewal (e.g. a comped \"free cycle\"); consumed at that renewal. Absent when the next cycle bills normally.","type":"object","properties":{"kind":{"type":"string","enum":["percent","amount"]},"value":{"type":"number"},"reason":{"type":"string"},"sourceId":{"type":"string"}},"required":["kind","value","reason"],"additionalProperties":false},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"}},"additionalProperties":false},"invoice":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["id","status","total","currency"],"additionalProperties":false,"description":"Slim ref to the invoice generated by the renewal"}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/tickets/":{"get":{"summary":"List Tickets","tags":["Tickets"],"description":"Lists the host's tickets as the compact projection, filtered and paginated.\nSorted by created date ascending (stable bundle order).","parameters":[{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false,"description":"Page number (0-based, default 0)"},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":500},"in":"query","name":"pageSize","required":false,"description":"Items per page (default 20, max 500)"},{"schema":{"type":"string"},"in":"query","name":"eventId","required":false,"description":"Filter to one event"},{"schema":{"type":"string"},"in":"query","name":"orderId","required":false,"description":"Filter to one order"},{"schema":{"type":"string"},"in":"query","name":"productId","required":false,"description":"Filter to one product"},{"schema":{"type":"string"},"in":"query","name":"productSetId","required":false,"description":"Filter to one product set"},{"schema":{"type":"string"},"in":"query","name":"timeslotId","required":false,"description":"Filter to one timeslot"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Filter by ticket type"},{"schema":{"type":"string"},"in":"query","name":"status","required":false,"description":"true = paid tickets only"},{"schema":{"type":"string"},"in":"query","name":"refunded","required":false,"description":"true = refunded only; false = non-refunded only"},{"schema":{"type":"string"},"in":"query","name":"cancelled","required":false,"description":"true = cancelled only"},{"schema":{"type":"string"},"in":"query","name":"checkedIn","required":false,"description":"true = checked-in only"},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false,"description":"Sort by created date (default: asc)"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Ticket ObjectId (used to generate the PDF/QR)"},"customerName":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"itemName":{"type":"string"},"eventId":{"type":"string"},"eventName":{"type":"string"},"orderId":{"type":"string"},"productId":{"type":"string"},"timeslotId":{"type":"string"},"date":{"description":"Ticket / event date (ISO 8601)","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"checkedIn":{"type":"boolean"},"isBoxOffice":{"type":"boolean"},"refunded":{"type":"boolean"},"status":{"type":"boolean","description":"True for paid tickets."},"type":{"type":"string"},"productType":{"type":"string"},"currency":{"type":"string"},"amount":{"type":"number","description":"Per-ticket gross, in cents."},"seatingInformation":{"type":"object","properties":{"section":{"anyOf":[{"type":"string"},{"type":"number"}]},"sectionId":{"anyOf":[{"type":"string"},{"type":"number"}]},"row":{"anyOf":[{"type":"string"},{"type":"number"}]},"seat":{"anyOf":[{"type":"string"},{"type":"number"}]}},"additionalProperties":{}}},"required":["id","customerName","firstName","lastName","email","itemName","status","amount"],"additionalProperties":{}}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/v1/tickets/sales-buckets":{"post":{"summary":"Get Ticket Sales Buckets","tags":["Tickets"],"description":"Valid ticket counts per time bucket (for a sales chart), plus per-bucket\ntotals and partner-credit (kickback) attribution. Provide ordered,\nnon-overlapping time buckets; omit event_id for account-wide.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event_id":{"description":"Scope to one event; omit for account-wide","type":"string"},"buckets":{"type":"array","items":{"type":"object","properties":{"startMs":{"type":"number","description":"Bucket start, epoch ms (inclusive)"},"endMs":{"type":"number","description":"Bucket end, epoch ms (inclusive)"},"label":{"type":"string"}},"required":["startMs","endMs","label"]},"description":"Ordered, non-overlapping time buckets (max 1000)"}},"required":["buckets"]}}}},"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"sum":{"type":"number","description":"Total valid tickets across all buckets"},"partner_credit":{"description":"Kickback attributed to the event, in cents","type":"number"},"data":{"type":"array","items":{"type":"number"},"description":"Valid ticket count per bucket"},"labels":{"type":"array","items":{"type":"string"}},"tickets":{"type":"object","properties":{"validTickets":{"type":"number"},"invalidTickets":{"type":"number"},"refundedTickets":{"type":"number"},"deletedTickets":{"type":"number"},"totalTickets":{"type":"number"}},"required":["validTickets","invalidTickets","refundedTickets","deletedTickets","totalTickets"],"additionalProperties":false}},"required":["sum","data","labels"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/widget/v1/events/":{"get":{"summary":"List public events (widget)","tags":["Widget"],"description":"Public, unauthenticated feed of published public events across one or more hosts.","parameters":[{"schema":{"type":"string"},"in":"query","name":"hosts","required":true,"description":"Comma-separated host IDs (1-10)"},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"pageSize","required":false},{"schema":{"type":"string","maxLength":200},"in":"query","name":"search","required":false},{"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"in":"query","name":"startBefore","required":false},{"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"in":"query","name":"startAfter","required":false},{"schema":{"type":"string","enum":["start","name"]},"in":"query","name":"sortField","required":false},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortDirection","required":false}],"security":[],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"schedule":{"type":"string","enum":["Single date","Multiple dates"]},"start":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"end":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"multiDayStartTimes":{"type":"array","items":{"type":"string"}},"multiDayEndTimes":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"minPriceCents":{"type":"number","nullable":true},"maxPriceCents":{"type":"number","nullable":true},"minBuyerPriceCents":{"description":"Minimum final price the buyer is charged, including the product's configured service fees, excluding tax. Null if the event has no priced products.","type":"number","nullable":true},"maxBuyerPriceCents":{"description":"Maximum final price the buyer is charged, including the product's configured service fees, excluding tax. Null if the event has no priced products.","type":"number","nullable":true},"currency":{"type":"string"},"timeZone":{"type":"string"},"isVirtual":{"type":"boolean"},"location":{"type":"object","properties":{"address":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"additionalProperties":false},"locationPlaceholder":{"type":"string"},"virtualEventLink":{"type":"string"},"image":{"type":"string"},"images":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"customTags":{"type":"array","items":{"type":"string"}},"isCancelled":{"type":"boolean"},"productSetId":{"description":"Root product set ID used by the widget checkout embed","type":"string"}},"required":["id","name","schedule","start","status","minPriceCents","maxPriceCents","minBuyerPriceCents","maxBuyerPriceCents","currency","isVirtual"],"additionalProperties":false}},"hasMore":{"type":"boolean"}},"required":["data","hasMore"],"additionalProperties":false}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/widget/v1/events/{id}":{"get":{"summary":"Get public event (widget)","tags":["Widget"],"description":"Public, unauthenticated detail for a single published public event, including description blocks and product set (checkout) ID.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"security":[],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"schedule":{"type":"string","enum":["Single date","Multiple dates"]},"start":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"end":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"multiDayStartTimes":{"type":"array","items":{"type":"string"}},"multiDayEndTimes":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"minPriceCents":{"type":"number","nullable":true},"maxPriceCents":{"type":"number","nullable":true},"minBuyerPriceCents":{"description":"Minimum final price the buyer is charged, including the product's configured service fees, excluding tax. Null if the event has no priced products.","type":"number","nullable":true},"maxBuyerPriceCents":{"description":"Maximum final price the buyer is charged, including the product's configured service fees, excluding tax. Null if the event has no priced products.","type":"number","nullable":true},"currency":{"type":"string"},"timeZone":{"type":"string"},"isVirtual":{"type":"boolean"},"location":{"type":"object","properties":{"address":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"additionalProperties":false},"locationPlaceholder":{"type":"string"},"virtualEventLink":{"type":"string"},"image":{"type":"string"},"images":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"customTags":{"type":"array","items":{"type":"string"}},"isCancelled":{"type":"boolean"},"productSetId":{"description":"Root product set ID used by the widget checkout embed","type":"string"},"description":{"type":"string"},"descriptionBlocks":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","image","video"]},"content":{"type":"string"},"id":{"type":"number"}},"required":["type","content","id"],"additionalProperties":false}},"language":{"type":"string"}},"required":["id","name","schedule","start","status","minPriceCents","maxPriceCents","minBuyerPriceCents","maxBuyerPriceCents","currency","isVirtual"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}}},"security":[{"bearerAuth":[]}],"tags":[{"name":"System","description":"Health check and API information"},{"name":"Events","description":"Event management"},{"name":"Contacts","description":"Contact/attendee management"},{"name":"Forms","description":"Form management"},{"name":"Email","description":"Email campaign management"},{"name":"Image Assets","description":"Saved images"},{"name":"Pages","description":"User-generated pages/email content"},{"name":"Widget","description":"Public endpoints that return published, public data without authentication, for use in embeds and widgets"}]}