{"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":{}},"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/contacts/":{"get":{"summary":"List Contacts","tags":["Contacts"],"description":"Lists the host's contacts, sorted and filtered. Paginated.","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"},"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"],"description":"Subset of statuses surfaced on the compact contact projection."},"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-z]{2,}$","description":"Contact email — unique per host, lowercased on persist"},"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"},"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"],"description":"Subset of statuses surfaced on the compact contact projection."},"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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contacts":{"minItems":1,"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}]},"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":{"type":"array","items":{"type":"object","properties":{"property_id":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"boolean"}]}},"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 (not just inserted) so re-imports refresh the persisted fields."}},"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"},"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"],"description":"Subset of statuses surfaced on the compact contact projection."},"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-z]{2,}$"},"phone":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}]},"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"},"vendorId":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"fullName":{"type":"string"},"phone":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}]},"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"}]}},"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"]},"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"]},"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":{"anyOf":[{"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,"enum":[null]}]}},"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/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":{"anyOf":[{"type":"number"},{"nullable":true,"enum":[null]}],"description":"Minimum ticket/product price in cents. Does not contain fees."},"maxPriceCents":{"anyOf":[{"type":"number"},{"nullable":true,"enum":[null]}],"description":"Maximum ticket/product price in cents. Does not contain fees."},"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/{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":{"anyOf":[{"type":"number"},{"nullable":true,"enum":[null]}],"description":"Minimum ticket/product price in cents. Does not contain fees."},"maxPriceCents":{"anyOf":[{"type":"number"},{"nullable":true,"enum":[null]}],"description":"Maximum ticket/product price in cents. Does not contain fees."},"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":{"anyOf":[{"type":"number"},{"nullable":true,"enum":[null]}],"description":"Minimum ticket/product price in cents. Does not contain fees."},"maxPriceCents":{"anyOf":[{"type":"number"},{"nullable":true,"enum":[null]}],"description":"Maximum ticket/product price in cents. Does not contain fees."},"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/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":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}]}},"required":["type","enumValue"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["duration"]},"durationDays":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"nullable":true,"enum":[null]}]}},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}]},"enumValues":{"description":"Replaces the list. Only meaningful for type='enum'","type":"array","items":{"type":"string"}},"metadata":{"anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"nullable":true,"enum":[null]}]}}}}}},"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":["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":["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}}}}}}},"/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":["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":["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":{"anyOf":[{"description":"If true, the name of the form will not be shown to respondents.","type":"boolean"},{"nullable":true,"enum":[null]}]},"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":{"anyOf":[{"description":"If `submitButtonWidth` is \"auto\", this determines how the submission button is horizontally aligned.","type":"string","enum":["left","center"]},{"nullable":true,"enum":[null]}]}},"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":["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":["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"]}}}}}},"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":["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":["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":["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":["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":["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 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 a element between\nthe buyer and attendee sections, use `move_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":{"anyOf":[{"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,"enum":[null]}]},"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."},"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":["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":["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 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 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":["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":["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 \"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":["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":["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 \"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":["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":["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 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":["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":["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 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":["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":["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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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}}}}}}},"/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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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.","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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}],"description":"Sequential invoice number; null while in draft"},"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/newsletters/":{"get":{"summary":"List Newsletters","tags":["Newsletters"],"description":"Lists the workspace's newsletters, optionally filtered by view (draft / past).\nPaginated; returns recipient-stripped summaries so list payloads stay small.\nSorted by updatedAt descending.","parameters":[{"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":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"pageNumber","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":["_id","subject","sent","date_sent","recipient_count","automatic","sync_event_recipients","data_version","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":"filters","required":false,"description":"JSON-encoded FilterGroup[] for custom filtering. Conditions\nreferencing fields outside the persisted newsletter schema are\nsilently ignored. ANDed with the 'view' filter when both are\nsupplied."},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"Comma-separated list of fields to return. Valid: id, hostId, subject, sent, date_sent, recipient_count, reply_to_email, display_name, automatic, data_version, sync_event_recipients, createdAt, updatedAt, sparkpost_metrics, attachments. 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"},"subject":{"type":"string"},"body":{"description":"Rendered HTML — empty for drafts","type":"string"},"sent":{"type":"boolean","description":"False for drafts, true for sent / scheduled"},"recipient_phonenumbers":{"type":"array","items":{"type":"string"}},"event_refs":{"type":"array","items":{"type":"string"}},"timeslot_refs":{"type":"array","items":{"type":"string"}},"date_sent":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"description":"Deprecated legacy content shape; new newsletters use viewport_data","type":"array","items":{}},"viewport_data":{"description":"Site-builder viewport_data — structured email content rendered to HTML by the send pipeline"},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"recipient_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string"},"click_rate":{"type":"string"},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units","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},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"}},"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}}}}}},"post":{"summary":"Create Newsletter","tags":["Newsletters"],"description":"Creates a new newsletter (draft by default). Compose the email body\nthrough 'viewport_data' (structured site-builder content) — do NOT\nsupply pre-rendered HTML; the send flow renders viewport_data into\nHTML for you. Recipient emails with typo-looking domains (e.g.\ngmial.com) are stripped before persistence.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"body":{"description":"Pre-rendered HTML; usually omitted on create and populated on send","type":"string"},"sent":{"description":"Defaults to false. Set true only by the send flow.","type":"boolean"},"recipient_emails":{"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"}},"date_sent":{"description":"ISO timestamp. Set by the send flow or the scheduled-send pipeline.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"description":"Flag for newsletters generated by the automatic event-broadcast flow","type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"type":"array","items":{}},"viewport_data":{},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","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"},"subject":{"type":"string"},"body":{"description":"Rendered HTML — empty for drafts","type":"string"},"sent":{"type":"boolean","description":"False for drafts, true for sent / scheduled"},"recipient_emails":{"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"}},"date_sent":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"description":"Deprecated legacy content shape; new newsletters use viewport_data","type":"array","items":{}},"viewport_data":{"description":"Site-builder viewport_data — structured email content rendered to HTML by the send pipeline"},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"recipient_count":{"description":"Set on summary projections from the paginated list endpoint","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string"},"click_rate":{"type":"string"},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units","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},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"}},"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/newsletters/{id}":{"get":{"summary":"Get Newsletter","tags":["Newsletters"],"description":"Retrieves a single newsletter 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. Valid: id, hostId, subject, body, sent, recipient_emails, recipient_phonenumbers, event_refs, timeslot_refs, date_sent, footer_image, reply_to_email, automatic, display_name, content_blocks, viewport_data, data_version, sync_event_recipients, recipient_count, attachments, sparkpost_metrics, createdAt, updatedAt. Omit for all fields."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Newsletter id, discoverable via list_newsletters"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"subject":{"type":"string"},"body":{"description":"Rendered HTML — empty for drafts","type":"string"},"sent":{"type":"boolean","description":"False for drafts, true for sent / scheduled"},"recipient_emails":{"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"}},"date_sent":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"description":"Deprecated legacy content shape; new newsletters use viewport_data","type":"array","items":{}},"viewport_data":{"description":"Site-builder viewport_data — structured email content rendered to HTML by the send pipeline"},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"recipient_count":{"description":"Set on summary projections from the paginated list endpoint","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string"},"click_rate":{"type":"string"},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units","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},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"}},"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 Newsletter","tags":["Newsletters"],"description":"Updates a newsletter's fields. Only provided fields change. Edit the\nemail body via 'viewport_data' (structured site-builder content) —\ndo NOT supply pre-rendered HTML; the send flow renders viewport_data\non dispatch. If recipient_emails is supplied, typo-domain addresses\nare stripped.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"body":{"description":"Pre-rendered HTML; usually omitted on create and populated on send","type":"string"},"sent":{"description":"Defaults to false. Set true only by the send flow.","type":"boolean"},"recipient_emails":{"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"}},"date_sent":{"description":"ISO timestamp. Set by the send flow or the scheduled-send pipeline.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"description":"Flag for newsletters generated by the automatic event-broadcast flow","type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"type":"array","items":{}},"viewport_data":{},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"]}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Newsletter id, discoverable via list_newsletters"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"subject":{"type":"string"},"body":{"description":"Rendered HTML — empty for drafts","type":"string"},"sent":{"type":"boolean","description":"False for drafts, true for sent / scheduled"},"recipient_emails":{"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"}},"date_sent":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"description":"Deprecated legacy content shape; new newsletters use viewport_data","type":"array","items":{}},"viewport_data":{"description":"Site-builder viewport_data — structured email content rendered to HTML by the send pipeline"},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"recipient_count":{"description":"Set on summary projections from the paginated list endpoint","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string"},"click_rate":{"type":"string"},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units","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},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"}},"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 Newsletter","tags":["Newsletters"],"description":"Permanently deletes a newsletter. No soft-delete; the row is removed.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Newsletter id, discoverable via list_newsletters"}],"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/newsletters/{id}/send":{"post":{"summary":"Send Newsletter","tags":["Newsletters"],"description":"Sends a newsletter through Sparkpost immediately. Stamps date_sent +\nsent=true on the persisted document.\nSeamless flow: call with just `id` once the draft has subject,\nrecipients, viewport_data, and reply_to_email set. The server pulls\nthose fields from the persisted doc and renders viewport_data →\nHTML server-side if no body is already rendered. Only pass\nsubject/senderName/replyToEmail/recipients/html/attachments when you\nexplicitly need to override the persisted values for this one send.\nThe Sparkpost API must be configured server-side; calls return 503\nwhen SPARKPOST_API_KEY is unset.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"html":{"description":"Pre-rendered HTML body. Usually omitted — the server renders\nviewport_data automatically if no body is persisted. Supply only\nwhen you need to override the 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.","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":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"]}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Newsletter id, discoverable via list_newsletters"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"subject":{"type":"string"},"body":{"description":"Rendered HTML — empty for drafts","type":"string"},"sent":{"type":"boolean","description":"False for drafts, true for sent / scheduled"},"recipient_emails":{"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"}},"date_sent":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"description":"Deprecated legacy content shape; new newsletters use viewport_data","type":"array","items":{}},"viewport_data":{"description":"Site-builder viewport_data — structured email content rendered to HTML by the send pipeline"},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"recipient_count":{"description":"Set on summary projections from the paginated list endpoint","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string"},"click_rate":{"type":"string"},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units","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},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"}},"required":["id","hostId","subject","sent","recipient_emails","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/newsletters/{id}/schedule":{"post":{"summary":"Schedule Newsletter","tags":["Newsletters"],"description":"Schedules a newsletter for future delivery. Stamps sent=true,\ndate_sent=<sendAt>, and a server-rendered body on the newsletter,\nthen enqueues a Firestore trigger row that fires the actual\nSparkpost transmission at sendAt. Does NOT call Sparkpost itself —\nthat happens at fire time.\nPreconditions checked before scheduling:\n- Newsletter exists and is owned by the caller's workspace\n- sendAt is strictly in the future\n- Newsletter has a non-empty subject\n- Newsletter has at least one recipient\n- Newsletter has viewport_data (or a previously-rendered body)\n— the server renders viewport_data to HTML and persists it as\nbody for the trigger to consume.\nFor immediate transmission, use send_newsletter 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\nnewsletter 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":"Newsletter id, discoverable via list_newsletters"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string"},"hostId":{"type":"string"},"subject":{"type":"string"},"body":{"description":"Rendered HTML — empty for drafts","type":"string"},"sent":{"type":"boolean","description":"False for drafts, true for sent / scheduled"},"recipient_emails":{"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"}},"date_sent":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|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"},"reply_to_email":{"type":"string"},"automatic":{"type":"boolean"},"display_name":{"type":"string"},"content_blocks":{"description":"Deprecated legacy content shape; new newsletters use viewport_data","type":"array","items":{}},"viewport_data":{"description":"Site-builder viewport_data — structured email content rendered to HTML by the send pipeline"},"data_version":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}],"description":"Content storage discriminator.\n- 0 (CONTENT_BLOCKS, deprecated): legacy content_blocks array\n- 1 (VIEWPORT_DATA): site-builder viewport_data shape"},"sync_event_recipients":{"type":"boolean"},"recipient_count":{"description":"Set on summary projections from the paginated list endpoint","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"attachments":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Original filename"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"File size in bytes"},"url":{"type":"string","description":"Publicly fetchable URL (Firebase Storage download URL in practice)"},"type":{"type":"string","description":"MIME type"},"uploading":{"description":"True while the attachment upload is in progress; false or omit once it finishes","type":"boolean"},"uploadError":{"description":"Surfaced when an attachment upload failed","type":"string"},"storagePath":{"description":"Firebase Storage path for deletion","type":"string"}},"required":["name","size","url","type"],"additionalProperties":false}},"sparkpost_metrics":{"type":"object","properties":{"count_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_delivered":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_opens":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_clicks":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_bounce":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"count_unsubscribe":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bounce_rate":{"type":"string","description":"Pre-formatted percentage, e.g. \"2.3%\""},"open_rate":{"type":"string"},"click_rate":{"type":"string"},"revenue_generated":{"description":"Revenue attributed via referral tracking, minor units","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},"createdAt":{"type":"number","description":"Creation timestamp, ms since epoch"},"updatedAt":{"type":"number","description":"Last-updated timestamp, ms since epoch"}},"required":["id","hostId","subject","sent","recipient_emails","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/newsletters/{id}/events":{"get":{"summary":"List Newsletter Email Events","tags":["Newsletters"],"description":"Lists Sparkpost bounce or open events for a sent newsletter. Returns\none cursor-paginated page. Events outside the (date_sent - 1 day, now\n+ 1 day) window aren't returned even if Sparkpost has them.","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":"Newsletter id, discoverable via list_newsletters"}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"recipient":{"type":"string"},"event_type":{"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"}},"required":["recipient","event_type","timestamp"],"additionalProperties":false}},"hasMore":{"type":"boolean"},"cursor":{"type":"string"},"nextCursor":{"anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}]},"pageSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["data","hasMore","cursor","nextCursor","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}}}},"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/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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"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","anyOf":[{"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"required":["featureKey","type","durationDays"]}]}},{"nullable":true,"enum":[null]}]},"nickname":{"description":"Pass null to clear; omit to preserve","anyOf":[{"type":"string"},{"nullable":true,"enum":[null]}]},"metadata":{"description":"Pass null to clear; omit to preserve","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"nullable":true,"enum":[null]}]}}}}}},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited"},"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":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"nullable":true,"enum":[null]}],"description":"null = unlimited / \"all time\""}},"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","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":{"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","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":{"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}}}},"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":{"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":{"anyOf":[{"description":"Optional information about this property.","type":"string"},{"nullable":true,"enum":[null]}]}}}}}},"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":{"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' — newsletter subject (newsletter 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 newsletter-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 newsletter 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 newsletter subject when newsletter_tracking_links=true (the label IS the newsletter id). Absent when the newsletter 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 a newsletter 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\nrendering the referral to a user — NEVER show 'label' directly,\nbecause for newsletter referrals it's the newsletter id (an opaque\nObjectId). Resolution:\n- newsletter referrals  → newsletter_subject (or \"(deleted newsletter)\" when the newsletter 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 newsletter-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 newsletter referrals this is the newsletter 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/newsletters/: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 newsletter 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 newsletter 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 newsletter subject when newsletter_tracking_links=true (the label IS the newsletter id). Absent when the newsletter 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 a newsletter 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\nrendering the referral to a user — NEVER show 'label' directly,\nbecause for newsletter referrals it's the newsletter id (an opaque\nObjectId). Resolution:\n- newsletter referrals  → newsletter_subject (or \"(deleted newsletter)\" when the newsletter 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/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, trialEnd, billingCycleAnchor, cancelAt, cancelAtPeriodEnd, canceledAt, endedAt, startedAt, dunningEnabled, autoCharge, nextRetryAt, retryCount, 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},"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},"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}":{"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, 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},"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},"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},"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},"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},"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}/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},"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},"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":{"anyOf":[{"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,"enum":[null]}]}},"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},"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}}}}}}}},"security":[{"bearerAuth":[]}],"tags":[{"name":"System","description":"Health check and API information"},{"name":"Events","description":"Event management"},{"name":"Forms","description":"Form management"}]}