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-IDdisplayOrder(array) - Array van element-ID’s die de weergavevolgorde definieert
Belangrijk: De displayOrder-array fungeert als zowel filter als volgordebepaler:
- Alleen elementen vermeld in
displayOrderworden getoond - Elementen die niet in
displayOrderstaan, 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:
options- Herbruikbare optielijsten voor SelectOne/SelectMany-vragenordinal-scale- Herbruikbare gelabelde schalen voor OrdinalScale-vrageninterval-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 documentatiedoeleindendata- 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:
| Type | Categorie | Beschrijving |
|---|---|---|
Markdown | Inhoud | Toon opgemaakte tekst en inhoud |
FlowControl | Besturing | Voorwaardelijke logica en navigatie |
String | Vraag | Tekstinvoer (één of meerdere regels) |
Number | Vraag | Numerieke invoer |
Date | Vraag | Datumkiezer |
Boolean | Vraag | Ja/Nee-selectievakje |
SelectOne | Vraag | Enkele keuze uit opties (radioknoppen) |
SelectMany | Vraag | Meerdere keuzes uit opties (selectievakjes) |
IntervalScale | Vraag | Numerieke beoordelingsschaal (bijv. 0-10 voor NPS, 1-5 voor tevredenheid) |
OrdinalScale | Vraag | Gelabelde beoordelingsschaal (bijv. Zeer mee oneens tot Zeer mee eens) |
Payment | Vraag | Betalingsverwerkingselement |
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 onmiddellijkpage-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 getoondrequired(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-formaatdefaultValue(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 waardemax(number, optioneel) - Maximaal toegestane waardestep(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")
- ISO-datumstring (bijv.
max(string, optioneel) - Laatst selecteerbare datum. Zelfde formaatopties alsmin
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 metvalue(nummer) encurrency(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 vergelijkingenfact(string) - De elementreferentie in het formaat ‘collectie-id/element-id’ om de waarde uit te lezenoperator(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 (geencomparenodig)
String:
"eq"- Gelijk aan"contains"- String bevat waarde"exists"- Heeft een waarde (geencomparenodig)
Boolean:
"true"- Waarde is waar (geencomparenodig)"exists"- Heeft een waarde (geencomparenodig)
SelectOne:
"eq"- Gelijk aan specifieke optie"in"- Is een van meerdere opties (vergelijkingswaarde moet SelectMany-formaat zijn)"exists"- Heeft een waarde (geencomparenodig)
SelectMany:
"eq"- Komt exact overeen met set opties"exists"- Heeft ten minste één waarde (geencomparenodig)
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 omname(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
| Versie | Datum | Wijzigingen |
|---|---|---|
| 1.0 | 15-11-2025 | Betaalelement |
| 0.5 | 24-01-2025 | Eerste openbare release |