changedInput schema / properties / questions / description
Previous value: -"Optional. A list of questions/page breaks to create at once, written into form.fields in order. Question types: SingleCheck/MultiCheck/TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via `multiple`, use it instead of SingleCheck/MultiCheck when there are more than 20 choices); Cascade (hierarchical choices via children, scored_quiz only); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz only); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz only, the 1..steps rating value is the question score unless per-star scores are set in the web app). Insert a page break with { type: \"Breaker\" }, which the AI can interleave between questions to paginate. Display blocks collect no answer: { type: \"Statement\", content } is a rich-text passage (intro / section lead-in / disclaimer) and { type: \"Swiper\", items } an image carousel. At most 100 items."New value: +"Optional. A list of questions/page breaks to create at once, written into form.fields in order. Question types: SingleCheck/MultiCheck/TrueFalse; FillBlank (free text — scored in quiz via correctAnswer, an unscored data-collection field in scored_quiz); DropDown (single or multiple via `multiple`, use it instead of SingleCheck/MultiCheck when there are more than 20 choices); Cascade (hierarchical choices via children, scored_quiz / ai_quiz); Ordering (quiz only, correctAnswer = all choices in the correct order); DateField/TimeField as unscored data-collection fields (scored_quiz / ai_quiz); NumberField (quiz: optional numeric correctAnswer + score; scored_quiz: the submitted number feeds report formulas); Rate (scored_quiz / ai_quiz; in scored_quiz the 1..steps rating value is the question score unless per-star scores are set in the web app); Attachment (ai_quiz only: a file upload with `kind` image / audio / video / document that the AI reads). Insert a page break with { type: \"Breaker\" }, which the AI can interleave between questions to paginate. Display blocks collect no answer: { type: \"Statement\", content } is a rich-text passage (intro / section lead-in / disclaimer) and { type: \"Swiper\", items } an image carousel. At most 100 items."
changedInput schema / properties / questions / items / description
Previous value: -"One question, a page break, or a display block (Statement / Swiper). FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Display blocks collect no answer, are never scored and are allowed in every scene: Statement takes `content` (the rich text IS the block) and Swiper takes `items` (an image carousel); both also accept an optional `name`, a label used by the web editor only, and neither takes any question field. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`). Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField are scored_quiz-only; and the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker."New value: +"One question, a page break, or a display block (Statement / Swiper). FIELD APPLICABILITY — `type` is the only field the schema always requires; `type` (plus the form scene) decides which of the remaining fields apply, and one that does not apply is either rejected with an explanatory error or ignored, so never pass it. Breaker (page break) takes nothing but `type`. Display blocks collect no answer, are never scored and are allowed in every scene: Statement takes `content` (the rich text IS the block) and Swiper takes `items` (an image carousel); both also accept an optional `name`, a label used by the web editor only, and neither takes any question field. Every question type takes `name` (required) plus the optional `code` / `description` / `explain` / `required`. Type-specific fields: SingleCheck / MultiCheck / DropDown / Ordering / Cascade need `choices` (Cascade nests via choices[i].children; DropDown also takes `multiple`; Ordering also takes `shuffle`); TrueFalse has a fixed pair of options and takes `trueLabel` / `falseLabel` instead of `choices`; DateField / TimeField take `precision`; NumberField takes `min` / `max` / `unit` / `decimalPlaces`; Rate takes `steps` / `words`; Attachment takes `kind` (required) / `maxFiles`. Scene rules for scoring: quiz — `correctAnswer` plus `score` > 0 are REQUIRED on SingleCheck / MultiCheck / DropDown / Ordering, optional on FillBlank (add `aiMatch` to have AI grade it instead of exact string match) and NumberField (omit both and the question is just a data-collection field), and rejected on DateField / TimeField; scored_quiz — score each option via choices[i].score; `correctAnswer` / `score` are rejected on NumberField and Rate (the submitted value is the score) and on FillBlank (free text is collected only, never scored); outcome — nothing is scored: `correctAnswer` / `score` / `aiMatch` are all rejected, every choice needs `outcomes` (TrueFalse votes via `trueOutcomes` / `falseOutcomes`); ai_quiz — nothing is scored: `correctAnswer` / `score` / `aiMatch` / choices[i].score are all rejected; an AI reads the answers and writes the report from report.aiReport. Type availability per scene: Ordering is knowledge_quiz-only; FillBlank works in knowledge_quiz (optionally scored) and in scored_quiz (data-collection only — its answer never feeds a score or a report formula); Cascade, Rate, DateField and TimeField work in scored_quiz and ai_quiz only; the outcome_quiz scene accepts only SingleCheck / MultiCheck / DropDown / TrueFalse / Breaker; the ai_quiz scene accepts every type except Ordering, plus Attachment (ai_quiz-only via MCP, at most 2 per form)."
addedInput schema / properties / questions / items / properties / kind
Added value: +{
+ "description": "Attachment only, and required there: what respondents upload, which also decides how the AI reads it (image = vision, audio / video = transcribed, document = text extracted). Per-file limits: image ≤10MB; audio ≤10MB and ≤180s; video ≤20MB and ≤60s; document ≤10MB. Fixed once the question exists — to change it, delete_question and add a new one. Rejected for other question types.",
+ "enum": [
+ "image",
+ "audio",
+ "video",
+ "document"
+ ],
+ "type": "string"
+}
addedInput schema / properties / questions / items / properties / maxFiles
Added value: +{
+ "description": "Attachment only: how many files a respondent may upload to this question (1-3, default 3). Rejected for other question types.",
+ "maximum": 3,
+ "minimum": 1,
+ "type": "integer"
+}
changedInput schema / properties / questions / items / properties / type / enum
Previous value: -[
- "SingleCheck",
- "MultiCheck",
- "TrueFalse",
- "FillBlank",
- "DateField",
- "TimeField",
- "NumberField",
- "Rate",
- "DropDown",
- "Cascade",
- "Ordering",
- "Breaker",
- "Statement",
- "Swiper"
-]New value: +[
+ "SingleCheck",
+ "MultiCheck",
+ "TrueFalse",
+ "FillBlank",
+ "DateField",
+ "TimeField",
+ "NumberField",
+ "Rate",
+ "DropDown",
+ "Cascade",
+ "Ordering",
+ "Attachment",
+ "Breaker",
+ "Statement",
+ "Swiper"
+]
changedInput schema / properties / report / description
Previous value: -"Report configuration. knowledge_quiz / scored_quiz: overallAnalysis fields are flat at the top level and dimensionAnalysis is nested (strongly recommended for the scored_quiz scene, optional for the knowledge_quiz scene). outcome: only the outcomes key (required at create time) and sectionOrder are allowed."New value: +"Report configuration. knowledge_quiz / scored_quiz: overallAnalysis fields are flat at the top level and dimensionAnalysis is nested (strongly recommended for the scored_quiz scene, optional for the knowledge_quiz scene). outcome: only the outcomes key (required at create time) and sectionOrder are allowed. ai_quiz: only aiReport and sectionOrder are allowed."
addedInput schema / properties / report / properties / aiReport
Added value: +{
+ "additionalProperties": false,
+ "description": "ai_quiz scene only (rejected elsewhere): how the AI writes each respondent's report. Sub-keys are merged — pass only the one you change; null or \"\" clears it.",
+ "properties": {
+ "instructions": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Generation instructions: what the report should cover, how to read the answers, what to recommend. Plain text (one paragraph per line) or description-scope rich text HTML. Reference a question as {{code}} (visible input questions only; call get_form for the codes) — the AI is pointed at that answer, the answer text itself is not inlined. Unknown codes are rejected. At most 20000 visible characters. get_form returns it in this same {{code}} form."
+ },
+ "style": {
+ "anyOf": [
+ {
+ "maxLength": 5000,
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Optional style and rules (tone, length, things to avoid), plain text, at most 5000 characters."
+ }
+ },
+ "type": "object"
+}
changedInput schema / properties / report / properties / sectionOrder / description
Previous value: -"Any scene: the order of the movable result-page sections — dimension (dimension breakdown / radar), booking (the 1:1 call block), feedback (the feedback block). The overall score / outcome always stays on top and the answer review / share area at the bottom. Keys you leave out keep their default relative order after the ones you list; [] restores the default (dimension, booking, feedback). Lead with booking when the quiz exists to book calls."New value: +"Any scene: the order of the movable result-page sections — dimension (dimension breakdown / radar), booking (the Cal.com booking block), feedback (the feedback block). The overall score / outcome always stays on top and the answer review / share area at the bottom. Keys you leave out keep their default relative order after the ones you list; [] restores the default (dimension, booking, feedback). Lead with booking when the quiz exists to book calls."
changedInput schema / properties / scene / description
Previous value: -"quiz=exam, scored_quiz=scored_quiz, outcome=typing quiz (votes decide which outcome type wins)"New value: +"knowledge_quiz = graded exam (correctAnswer + score); scored_quiz = option scoring + report formula; outcome_quiz = typing quiz (votes decide which outcome type wins); ai_quiz = no scoring, an AI writes each report from report.aiReport (may include Attachment uploads). Immutable after creation."
changedInput schema / properties / scene / enum
Previous value: -[
- "knowledge_quiz",
- "scored_quiz",
- "outcome_quiz"
-]New value: +[
+ "knowledge_quiz",
+ "scored_quiz",
+ "outcome_quiz",
+ "ai_quiz"
+]
changedOutput schema / properties / scene / description
Previous value: -"knowledge_quiz / scored_quiz / outcome_quiz"New value: +"knowledge_quiz / scored_quiz / outcome_quiz / ai_quiz"