Open Survey Formaat

Een open, op JSON gebaseerd formaat voor het definiëren van enquêtes en formulieren. Gebruikt door YourOpinion.is en gratis door iedereen te implementeren.

Huidige versie: 1.0 (Gepubliceerd: 15-11-2025)

Vereenvoudigde Markdown-versie

Als alternatief is er een vereenvoudigd op Markdown gebaseerd importprotocol, voornamelijk ontworpen voor AI-agents. Dit protocol gebruikt een “Rich Markdown”-dialect om vragen, opties en pagina-einden te definiëren met standaard tekstopmaak. In plaats van een diep genest JSON-object te bouwen, genereert een agent een gestructureerde Markdown-string en codeert deze in een enkele aanklikbare URL. Door op de link te klikken wordt de enquête direct in de browser gereconstrueerd.

Specificatie downloaden

  • JSON Schema - Machineleesbare formaatdefinitie
  • Markdown - Mensleesbare documentatie (geoptimaliseerd voor LLM’s)

Inleiding

Het Open Survey Formaat biedt een gestandaardiseerde manier om enquêtes, vragenlijsten en formulieren als JSON-objecten te definiëren. Dit formaat maakt het volgende mogelijk:

  • Portabiliteit - Verplaats enquêtes tussen verschillende platforms en tools
  • Versiebeheer - Houd wijzigingen in enquêtes bij met standaard diff-tools
  • Programmatische generatie - Maak enquêtes dynamisch aan via code
  • LLM-compatibiliteit - AI-assistenten kunnen eenvoudig enquêtes maken en wijzigen

Kernconcepten

Collecties (Pagina’s)

Enquêtes zijn georganiseerd in collecties, die fungeren als pagina’s of secties. Elke enquête moet ten minste één collectie bevatten.

Elementen

Individuele componenten binnen een collectie, zoals:

  • Vragen (tekstinvoer, meerkeuze, beoordelingen, enz.)
  • Inhoudsblokken (markdown-tekst, afbeeldingen)
  • Besturingsstroomelementen (voorwaardelijke logica, pagina-sprongen)

Assets

Herbruikbare componenten waarnaar door meerdere vragen kan worden verwezen:

  • Optielijsten (voor selectievragen)
  • Beoordelingsschalen
  • Gedeelde bronnen

Documentstructuur

Een enquête wordt weergegeven als een JSON-object met deze structuur:

{
    "$schema": "https://youropinion.is/json-schema/1.0",
    "$readme": "https://youropinion.is/docs/survey-format.md",
    "collections": {
        "collection-id-1": {
            "name": "Collectienaam",
            "elements": {
                "element-id-1": {
                    "type": "Markdown",
                    "data": {
                        /* Elementspecifieke gegevens */
                    }
                }
            },
            "displayOrder": ["element-id-1"]
        }
    },
    "displayOrder": ["collection-id-1"],
    "assets": {
        "asset-id-1": {
            "type": "options",
            "data": {
                /* Asset-specifieke gegevens */
            }
        }
    }
}

Eigenschappen op hoofdniveau

$schema (optioneel)

URL naar de JSON Schema-definitie voor validatie:

"$schema": "https://youropinion.is/json-schema/1.0"

$readme (optioneel)

URL naar mensleesbare documentatie:

"$readme": "https://youropinion.is/docs/survey-format.md"

collections (verplicht)

Object dat enquêtepagina’s/secties bevat. Elke sleutel is een unieke collectie-ID:

"collections": {
    "welcome": {
        "name": "Welkomstpagina",
        "elements": { /* ... */ },
        "displayOrder": ["intro", "consent"]
    },
    "questions": {
        "name": "Hoofdvragen",
        "elements": { /* ... */ },
        "displayOrder": ["q1", "q2", "q3"]
    }
}

Collectie-eigenschappen:

  • name (string, optioneel) - Mensleesbare collectienaam (niet getoond aan gebruikers, gebruikt ter referentie)
  • condition (object, optioneel) - Voorwaardelijke logica om te bepalen of deze collectie getoond moet worden (zie sectie Voorwaardelijke Logica)
  • elements (object) - Bevat de elementen voor deze collectie. Elke sleutel is een unieke element-ID
  • displayOrder (array) - Array van element-ID’s die de weergavevolgorde definieert

Belangrijk: De displayOrder-array fungeert als zowel filter als volgordebepaler:

  • Alleen elementen vermeld in displayOrder worden getoond
  • Elementen die niet in displayOrder staan, blijven in de definitie maar zijn verborgen
  • Het opnemen van een niet-bestaande element-ID veroorzaakt een fout

displayOrder (verplicht)

Array die de volgorde van collecties specificeert:

"displayOrder": ["welcome", "questions", "thank-you"]

Dezelfde filterregels zijn van toepassing: alleen hier vermelde collecties worden getoond.

assets (optioneel)

Herbruikbare componenten waarnaar door meerdere elementen wordt verwezen. Assets verminderen duplicatie en maken enquêtes makkelijker te onderhouden.

Asset-types:

  1. options - Herbruikbare optielijsten voor SelectOne/SelectMany-vragen
  2. ordinal-scale - Herbruikbare gelabelde schalen voor OrdinalScale-vragen
  3. interval-scale - Herbruikbare numerieke schalen voor IntervalScale-vragen

Voorbeeld - Opties asset:

"assets": {
    "color-options": {
        "type": "options",
        "name": "Kleuropties",
        "data": {
            "options": {
                "red": { "label": "Rood" },
                "blue": { "label": "Blauw" },
                "green": { "label": "Groen" },
                "yellow": { "label": "Geel" }
            },
            "displayOrder": ["red", "blue", "green", "yellow"]
        }
    },
    "satisfaction-scale": {
        "type": "ordinal-scale",
        "name": "Standaard tevredenheidsschaal",
        "data": {
            "labels": {
                "1": "Zeer ontevreden",
                "2": "Ontevreden",
                "3": "Neutraal",
                "4": "Tevreden",
                "5": "Zeer tevreden"
            }
        }
    },
    "nps-scale": {
        "type": "interval-scale",
        "name": "Net Promoter Score Schaal",
        "data": {
            "start": 0,
            "end": 10,
            "labels": {
                "start": "Niet waarschijnlijk",
                "end": "Zeer waarschijnlijk"
            }
        }
    }
}

Alle asset-types vereisen:

  • type - Asset-type: "options", "ordinal-scale", of "interval-scale"
  • name - Mensleesbare naam voor documentatiedoeleinden
  • data - Type-specifieke gegevensstructuur

Er kan naar assets worden verwezen met behulp van JSON-referenties (zie sectie JSON-referenties).


Elementtypes

Elementen zijn de bouwstenen van je enquête. Elk element heeft een type en data eigenschap. Alle elementen kunnen optioneel een extensions-object bevatten voor aangepaste metadata (niet gebruikt door de standaard renderer).

Beschikbare elementtypes:

TypeCategorieBeschrijving
MarkdownInhoudToon opgemaakte tekst en inhoud
FlowControlBesturingVoorwaardelijke logica en navigatie
StringVraagTekstinvoer (één of meerdere regels)
NumberVraagNumerieke invoer
DateVraagDatumkiezer
BooleanVraagJa/Nee-selectievakje
SelectOneVraagEnkele keuze uit opties (radioknoppen)
SelectManyVraagMeerdere keuzes uit opties (selectievakjes)
IntervalScaleVraagNumerieke beoordelingsschaal (bijv. 0-10 voor NPS, 1-5 voor tevredenheid)
OrdinalScaleVraagGelabelde beoordelingsschaal (bijv. Zeer mee oneens tot Zeer mee eens)
PaymentVraagBetalingsverwerkingselement

Inhoudselementen

Markdown

Toon opgemaakte tekst, koppen, lijsten en andere inhoud met behulp van Markdown-syntaxis.

{
    "type": "Markdown",
    "data": {
        "markdown": "# Welkom!\n\nBedankt voor het invullen van onze enquête.\n\n- Antwoord alsjeblieft eerlijk\n- Alle antwoorden zijn anoniem"
    }
}

Ondersteunde Markdown:

  • Koppen (#, ##, ###)
  • Lijsten (geordend en ongeordend)
  • Vet (**tekst**) en cursief (*tekst*)
  • Links ([tekst](url))
  • Codeblokken

FlowControl

Beheer de enquêtevoortgang met voorwaardelijke logica en navigatie.

{
    "type": "FlowControl",
    "data": {
        "condition": {
            /* Optioneel - Zie sectie Voorwaardelijke Logica */
        },
        "action": {
            "type": "survey-finish" // Opties: "survey-finish" of "page-finish"
        }
    }
}

Actietypes:

  • survey-finish - Voltooi de enquête onmiddellijk
  • page-finish - Beëindig de huidige pagina en ga naar de volgende

Voor gedetailleerde informatie over de structuur van voorwaarden en voorbeelden, zie de sectie Voorwaardelijke Logica hieronder.


Vraagtypes

Alle vragen delen deze gemeenschappelijke eigenschappen:

{
    "type": "QuestionType",
    "data": {
        "label": "Je vraagtekst hier",
        "required": "yes", // Optioneel: "yes", "no", of "suggested" (standaard is "no")
        "markdown": "Hulptekst" // Optioneel: aanvullende context in Markdown
    }
}

Gemeenschappelijke eigenschappen:

  • label (string, verplicht) - De vraagtekst die aan gebruikers wordt getoond
  • required (string, optioneel) - Of antwoord verplicht is: "yes", "no", of "suggested" (toont als optioneel maar wordt aangemoedigd)
  • markdown (string, optioneel) - Aanvullende hulptekst of beschrijving in Markdown-formaat
  • defaultValue (any, optioneel) - Vooraf ingevulde waarde voor de vraag

String

Tekstinvoer van één of meerdere regels.

{
    "type": "String",
    "data": {
        "label": "Wat is je naam?",
        "placeholder": "Vul je volledige naam in", // Optioneel
        "multiline": false, // Optioneel: true voor tekstvak (textarea)
        "required": "yes"
    }
}

Number

Numerieke invoer met optionele validatie.

{
    "type": "Number",
    "data": {
        "label": "Hoeveel werknemers?",
        "min": 1, // Optioneel: minimumwaarde
        "max": 1000, // Optioneel: maximumwaarde
        "step": 1, // Optioneel: stapgrootte (standaard: 1)
        "required": "yes"
    }
}

Eigenschappen:

  • min (number, optioneel) - Minimaal toegestane waarde
  • max (number, optioneel) - Maximaal toegestane waarde
  • step (number, optioneel) - Stapgrootte voor invoervalidatie (standaard: 1)

Date

Datumkiezer met optioneel nauwkeurigheidsniveau en min/max beperkingen.

{
    "type": "Date",
    "data": {
        "label": "Wanneer ben je begonnen?",
        "required": "suggested",
        "accuracy": "day", // Optioneel: "day", "month", of "year" (standaard: "day")
        "min": "2020-01-01", // Optioneel: vroegst selecteerbare datum
        "max": "2025-12-31" // Optioneel: laatst selecteerbare datum
    }
}

Eigenschappen:

  • accuracy (string, optioneel) - Datumnauwkeurigheid:
    • "day" - Volledige datumkiezer met kalender (standaard)
    • "month" - Maand en jaar dropdown-selectie
    • "year" - Alleen jaar dropdown-selectie
  • min (string, optioneel) - Vroegst selecteerbare datum. Kan zijn:
    • ISO-datumstring (bijv. "2020-01-01")
    • Relatieve tijdstring (bijv. "+ 3 months", "now", "- 1 year")
  • max (string, optioneel) - Laatst selecteerbare datum. Zelfde formaatopties als min

Boolean

Ja/Nee-selectievakje. Standaardwaarde is false (niet aangevinkt).

{
    "type": "Boolean",
    "data": {
        "label": "Algemene voorwaarden",
        "description": "Ik ga akkoord met de voorwaarden" // Getoond naast selectievakje
    }
}

SelectOne

Meerkeuzevraag (radioknoppen) - gebruikers selecteren één optie.

{
    "type": "SelectOne",
    "data": {
        "label": "Wat is je lievelingskleur?",
        "required": "yes",
        "options": {
            "options": {
                "red": { "label": "Rood" },
                "blue": { "label": "Blauw" },
                "green": { "label": "Groen" }
            },
            "displayOrder": ["red", "blue", "green"]
        }
    }
}

Gebruik van asset-referenties:

{
    "type": "SelectOne",
    "data": {
        "label": "Kies een kleur",
        "options": { "$ref": "#/assets/color-options/data" }
    }
}

SelectMany

Meerkeuzevraag (selectievakjes) - gebruikers kunnen meerdere opties selecteren.

{
    "type": "SelectMany",
    "data": {
        "label": "Welke besturingssystemen gebruik je?",
        "required": "yes",
        "options": {
            "options": {
                "windows": { "label": "Windows" },
                "macos": { "label": "macOS" },
                "linux": { "label": "Linux" }
            },
            "displayOrder": ["windows", "macos", "linux"]
        },
        "other": true, // Optioneel: voeg optie "Anders" toe met tekstinvoer
        "minSelections": 1, // Optioneel: minimum aantal vereiste selecties
        "maxSelections": 3 // Optioneel: maximum aantal toegestane selecties
    }
}

IntervalScale

Numerieke beoordelingsschaal met een gedefinieerd bereik (bijv. 0-10 voor NPS, 1-5 voor tevredenheid). Veel gebruikt voor:

  • Net Promoter Score (NPS): 0-10 schaal
  • Tevredenheidsbeoordelingen: 1-5 of 1-7 schaal
  • Waarschijnlijkheidsvragen: 0-10 schaal
{
    "type": "IntervalScale",
    "data": {
        "label": "Hoe waarschijnlijk is het dat je ons aanbeveelt aan een vriend?",
        "required": "yes",
        "scale": {
            "start": 0, // Startnummer van de schaal
            "end": 10, // Eindnummer van de schaal
            "labels": {
                // Labels voor start- en eindpunten (verplicht)
                "start": "Helemaal niet waarschijnlijk",
                "end": "Zeer waarschijnlijk"
            }
        }
    }
}

Veelvoorkomende toepassingen:

// Net Promoter Score (NPS)
{
    "type": "IntervalScale",
    "data": {
        "label": "Hoe waarschijnlijk is het dat je ons aanbeveelt?",
        "scale": {
            "start": 0,
            "end": 10,
            "labels": {
                "start": "Niet waarschijnlijk",
                "end": "Zeer waarschijnlijk"
            }
        }
    }
}

// 5-punts tevredenheidsschaal
{
    "type": "IntervalScale",
    "data": {
        "label": "Hoe tevreden ben je met onze service?",
        "scale": {
            "start": 1,
            "end": 5,
            "labels": {
                "start": "Zeer ontevreden",
                "end": "Zeer tevreden"
            }
        }
    }
}

Weergave: Toont een horizontale schaal met aanklikbare nummers. Labels verschijnen onder de start- en eindpunten.

OrdinalScale

Gelabelde beoordelingsschaal waarbij elk punt een aangepast label heeft. Ideaal voor:

  • Likert-schalen met specifieke bewoordingen voor elk punt
  • Overeenstemmingsschalen (Zeer mee oneens → Zeer mee eens)
  • Frequentieschalen (Nooit → Altijd)
  • Aangepaste beoordelingsschalen met betekenisvolle labels
{
    "type": "OrdinalScale",
    "data": {
        "label": "Hoe tevreden ben je met je functie?",
        "required": "yes",
        "scale": {
            "labels": {
                "1": "Zeer ontevreden",
                "2": "Ontevreden",
                "3": "Neutraal",
                "4": "Tevreden",
                "5": "Zeer tevreden"
            }
        }
    }
}

Veelvoorkomende toepassingen:

// Likert overeenstemmingsschaal
{
    "type": "OrdinalScale",
    "data": {
        "label": "Het product voldeed aan mijn verwachtingen",
        "scale": {
            "labels": {
                "1": "Zeer mee oneens",
                "2": "Mee oneens",
                "3": "Noch mee eens, noch mee oneens",
                "4": "Mee eens",
                "5": "Zeer mee eens"
            }
        }
    }
}

// Frequentieschaal
{
    "type": "OrdinalScale",
    "data": {
        "label": "Hoe vaak gebruik je ons product?",
        "scale": {
            "labels": {
                "1": "Nooit",
                "2": "Zelden",
                "3": "Soms",
                "4": "Vaak",
                "5": "Altijd"
            }
        }
    }
}

Weergave: Toont gelabelde knoppen of opties. Elk label wordt volledig weergegeven, waardoor de schaal zichzelf verklaart.

IntervalScale vs OrdinalScale:

  • Gebruik IntervalScale wanneer de getallen zelf betekenis hebben (0-10, 1-5)
  • Gebruik OrdinalScale wanneer je aangepaste labels voor elk punt nodig hebt
  • IntervalScale is compacter; OrdinalScale is beschrijvender

Payment

Verzamel betalingsinformatie en verwerk transacties. Integreert met betalingsproviders die zijn geconfigureerd in je enquête-instellingen.

{
    "type": "Payment",
    "data": {
        "label": "Betaling",
        "required": "yes",
        "amount": {
            "value": 29.99,
            "currency": "USD"
        },
        "captureMethod": "automatic" // Optioneel: "immediate", "manual", of "automatic"
    }
}

Eigenschappen:

  • amount (object, verplicht) - Betalingsbedrag met value (nummer) en currency (3-letterige code, bijv. “USD”, “EUR”, “GBP”)
  • captureMethod (string, optioneel) - Wanneer de betaling vast te leggen:
    • "immediate" - Leg betaling direct vast wanneer enquête wordt ingediend
    • "manual" - Vereist handmatige vastlegging via je betalingsdashboard
    • "automatic" - Leg automatisch vast wanneer enquête is voltooid (standaard)

Opmerking: Betalingsverwerking vereist dat er een betalingsprovider is geconfigureerd in je kanaalinstellingen. Ondersteunde valuta’s en betaalmethoden zijn afhankelijk van de configuratie van je provider.


JSON-referenties

Verminder duplicatie door te verwijzen naar herbruikbare componenten. Referenties gebruiken dit formaat:

{ "$ref": "[<locatie>]#<pad>" }
  • locatie - URL naar brondocument (leeg = huidig document)
  • pad - Pad vanaf document-root met / scheidingstekens

Voorbeeld - Inline duplicatie:

{
    "question-1": {
        "type": "SelectOne",
        "data": {
            "label": "Lievelingskleur?",
            "options": {
                "options": {
                    "red": { "label": "Rood" },
                    "blue": { "label": "Blauw" }
                },
                "displayOrder": ["red", "blue"]
            }
        }
    },
    "question-2": {
        "type": "SelectOne",
        "data": {
            "label": "Minst favoriete kleur?",
            "options": {
                "options": {
                    "red": { "label": "Rood" },
                    "blue": { "label": "Blauw" }
                },
                "displayOrder": ["red", "blue"]
            }
        }
    }
}

Beter - Gebruik van assets:

{
    "collections": {
        "main": {
            "elements": {
                "question-1": {
                    "type": "SelectOne",
                    "data": {
                        "label": "Lievelingskleur?",
                        "options": { "$ref": "#/assets/colors/data" }
                    }
                },
                "question-2": {
                    "type": "SelectOne",
                    "data": {
                        "label": "Minst favoriete kleur?",
                        "options": { "$ref": "#/assets/colors/data" }
                    }
                }
            },
            "displayOrder": ["question-1", "question-2"]
        }
    },
    "assets": {
        "colors": {
            "type": "options",
            "data": {
                "options": {
                    "red": { "label": "Rood" },
                    "blue": { "label": "Blauw" }
                },
                "displayOrder": ["red", "blue"]
            }
        }
    }
}

Voordelen:

  • Eén enkele bron van waarheid
  • Eenvoudiger onderhoud
  • Betere diffs bij versiebeheer
  • Kleinere bestandsgrootte

Voorwaardelijke Logica

Voorwaardelijke logica stelt je in staat dynamische enquêtes te maken die zich aanpassen op basis van antwoorden van gebruikers. Voorwaarden kunnen op twee manieren worden gebruikt:

1. Voorwaarden op collectieniveau

Toon of verberg hele pagina’s op basis van voorwaarden. Als de voorwaarde van een collectie evalueert naar false, wordt de hele pagina overgeslagen en gaat de uitvoering naar de volgende collectie.

{
    "collections": {
        "follow-up": {
            "name": "Vervolgvragen",
            "condition": {
                "type": "condition",
                "fact": "questions/nps-score",
                "operator": "lt",
                "compare": { "value": 7 }
            }
            "elements": {
                /* ... */
            },
            "displayOrder": ["question-1"]
        }
    }
}

In dit voorbeeld wordt de pagina “Vervolgvragen” alleen getoond als de NPS-score lager is dan 7.

2. FlowControl-elementen

Beheer de enquêtevoortgang binnen een pagina met FlowControl-elementen. Wanneer de voorwaarde evalueert naar true, wordt de opgegeven actie uitgevoerd.

Beschikbare acties:

  • survey-finish - Voltooi de enquête onmiddellijk (sla alle resterende pagina’s over)
  • page-finish - Beëindig de huidige pagina en ga naar de volgende (sla resterende elementen op de huidige pagina over)
{
    "type": "FlowControl",
    "data": {
        "condition": {
            "type": "condition",
            "fact": "satisfaction",
            "operator": "eq",
            "compare": { "value": "very-satisfied" }
        },
        "action": {
            "type": "page-finish"
        }
    }
}

Opmerking: Als er geen condition wordt opgegeven, wordt de actie altijd uitgevoerd wanneer het element wordt bereikt.

Structuur van voorwaarden

Voorwaarden worden gedefinieerd als een binaire boom met twee knooppunttypes:

1. Vergelijkingsvoorwaarden

Vergelijk een feit (enquête-antwoord) met een waarde of een ander feit.

{
    "type": "condition",
    "fact": "questions/age",
    "operator": "gt",
    "compare": { "value": 18 }
}

Eigenschappen:

  • type - Altijd "condition" voor vergelijkingen
  • fact (string) - De elementreferentie in het formaat ‘collectie-id/element-id’ om de waarde uit te lezen
  • operator (string) - Vergelijkingsoperator (zie operatoren hieronder)
  • compare (object, optioneel) - Waarmee te vergelijken:
    • { "value": <any> } - Vergelijk met een letterlijke waarde
    • { "fact": "<collectie-id/element-id>" } - Vergelijk met de waarde van een ander element
    • Niet vereist voor operatoren zoals "exists" of "true"
  • not (boolean, optioneel) - Keer het resultaat om (standaard: false)

Ondersteunde operatoren per elementtype:

Number, IntervalScale, OrdinalScale, Date:

  • "eq" - Gelijk aan
  • "gt" - Groter dan
  • "gte" - Groter dan of gelijk aan
  • "lt" - Kleiner dan
  • "lte" - Kleiner dan of gelijk aan
  • "exists" - Heeft een waarde (geen compare nodig)

String:

  • "eq" - Gelijk aan
  • "contains" - String bevat waarde
  • "exists" - Heeft een waarde (geen compare nodig)

Boolean:

  • "true" - Waarde is waar (geen compare nodig)
  • "exists" - Heeft een waarde (geen compare nodig)

SelectOne:

  • "eq" - Gelijk aan specifieke optie
  • "in" - Is een van meerdere opties (vergelijkingswaarde moet SelectMany-formaat zijn)
  • "exists" - Heeft een waarde (geen compare nodig)

SelectMany:

  • "eq" - Komt exact overeen met set opties
  • "exists" - Heeft ten minste één waarde (geen compare nodig)

2. Ketenvoorwaarden

Combineer meerdere voorwaarden met logische operatoren.

{
    "type": "all",
    "items": [
        {
            "type": "condition",
            "fact": "questions/age",
            "operator": "gt",
            "compare": { "value": 18 }
        },
        {
            "type": "condition",
            "fact": "questions/country",
            "operator": "eq",
            "compare": { "value": "US" }
        }
    ]
}

Eigenschappen:

  • type - Logische operator:
    • "all" - Alle voorwaarden moeten waar zijn (EN-logica)
    • "any" - Ten minste één voorwaarde moet waar zijn (OF-logica)
  • items (array) - Array van voorwaarden (kunnen vergelijkingen of geneste ketens zijn)
  • not (boolean, optioneel) - Keer het resultaat van de hele keten om
  • name (string, optioneel) - Mensleesbaar label voor documentatie

Voorbeelden

Enquête overslaan voor tevreden klanten

{
    "type": "FlowControl",
    "data": {
        "condition": {
            "type": "condition",
            "fact": "questions/nps",
            "operator": "gte",
            "compare": { "value": 9 }
        },
        "action": {
            "type": "survey-finish"
        }
    }
}

Toon pagina alleen voor specifieke leeftijdsgroep

{
    "collections": {
        "teen-questions": {
            "name": "Vragen voor tieners",
            "condition": {
                "type": "all",
                "items": [
                    {
                        "type": "condition",
                        "fact": "questions/age",
                        "operator": "gte",
                        "compare": { "value": 13 }
                    },
                    {
                        "type": "condition",
                        "fact": "questions/age",
                        "operator": "lt",
                        "compare": { "value": 20 }
                    }
                ]
            },
            "elements": {
                /* ... */
            }
        }
    }
}

Complexe geneste voorwaarden

{
    "type": "any",
    "name": "Premium-gebruikers of grote uitgaven",
    "items": [
        {
            "type": "condition",
            "fact": "questions/membership",
            "operator": "eq",
            "compare": { "value": "premium" }
        },
        {
            "type": "all",
            "items": [
                {
                    "type": "condition",
                    "fact": "questions/total-spent",
                    "operator": "gt",
                    "compare": { "value": 1000 }
                },
                {
                    "type": "condition",
                    "fact": "questions/active-months",
                    "operator": "gte",
                    "compare": { "value": 6 }
                }
            ]
        }
    ]
}

Twee feiten vergelijken

{
    "type": "condition",
    "fact": "questions/current-salary",
    "operator": "gt",
    "compare": { "fact": "questions/desired-salary" }
}

De not-eigenschap gebruiken

{
    "type": "condition",
    "fact": "questions/email-consent",
    "operator": "true",
    "not": true // Keert resultaat om: waar wanneer email-consent NIET waar is
}

Versiegeschiedenis

VersieDatumWijzigingen
1.015-11-2025Betaalelement
0.524-01-2025Eerste openbare release