Feature toggles
Many Riddle features consist of two things: the content of the feature, and a flag saying whether it is used. In a builder config you normally only send the content - supplying a feature's content switches the feature on. Sending an explanation enables the explanation, sending a footerText enables the footer text, sending an adTop slot enables ads.
For every such feature the flag is also available as a property of its own, so you can state it explicitly.
The rule
- Send only the content → the feature is switched on.
- Send the flag as
true→ same thing, explicit. - Send the content and the flag as
false→ the content stays stored, the feature is off. - Send neither → nothing changes.
An explicit flag is always applied after the content it belongs to, so it always wins - the order inside your JSON object does not matter.
Case 3 is what makes a feature switchable again when editing an existing Riddle: without it, resending a configuration would silently switch every configured feature back on.
{
"blocks": [
{
"id": 1,
"explanation": "Paris has been the capital since 508.",
"isExplanationEnabled": false
}
]
}
The explanation stays exactly as it is, but is no longer shown. Dropping isExplanationEnabled from the same request would switch it back on.
Round trips
Reading a Riddle back always returns the flag next to the feature it belongs to, so "is this on?" is answered by the configuration itself and an off state survives being sent back unchanged. A feature nobody ever configured is left out entirely, flag included.
Where they are
| Flag | Where | Switched on by |
|---|---|---|
isEnabled | preset.riddleTimer, preset.blockTimer, preset.autoClose | Sending the object |
isEnabled | preset.customStrings | Sending at least one string |
isEnabled | preset.footerText | A non-empty text |
isEnabled | preset.ads, and each of its adTop / adBottom slots | Sending a slot / the slot's projectSlot or iframe |
isAutoOpenEnabled | preset | autoOpenDate |
isResultEnabled | preset.autoClose | resultId |
areIndividualTimesEnabled | preset.blockTimer | individualBlockTimes |
isCustomConfirmationPageEnabled | publish.doi | Any of the confirmation page properties |
isExplanationEnabled | A Quiz question / answer | explanation |
isRankFormatEnabled | An "order it" block | rankFormat |
isDescriptionVisible | A choice block | Any item description |
areOtherResultsEnabled, isIncludeCTAButtonEnabled | A personality result | The other results / CTA button properties |
isDescriptionEnabled, isPrefilledTextEnabled, isAdvancedValidationEnabled | A form field | description / prefilledText / regex |
isShowNextButtonAfterDelayEnabled | An Ad block | A showNextButtonDelay greater than 0 |
isSuccessMessageEnabled | A Sudoku block | A non-empty successMessage |
isDelayEnabled | A result redirect | A delay greater than 0 |
Flags that are not derived from anything - isRequired on a form field, preset.riddleSingleVote.isEnabled, preset.pagination.isEnabled and the like - are ordinary properties and behave exactly as they read.

