Typtests sporen valsspelen op door het toetslogboek achter elke score te controleren. Onze test herberekent elk resultaat uit zijn toetslogboek, controleert een hash, test de structuur en timing van het logboek, en houdt elk getimed resultaat boven 130 WPM waarvan de timing ook ongebruikelijk oogt van de openbare ranglijsten tot je een hertest haalt. Timingcontroles vangen slordige bots; de hertest dwingt een zorgvuldige bot om alles nog een keer te doen.
De eerste bot die onze timingcontroles versloeg, was van onszelf.
Onze hulpfunctie voor end-to-endtests drukte toetsen in met een vaste tussenpoos van 40 ms, want dat is wat een testscript doet. De server herberekende het resultaat, bevestigde de hash en beoordeelde de run als verdacht: geen enkele variatie tussen aanslagen, geen rollover, identieke indruktijden. We moesten willekeurige jitter per woord toevoegen en af en toe een "denkpauze" van 80 tot 300 ms voordat onze eigen testsuite een menselijk ogend resultaat kon insturen. De optie staat nog in de code, met het label humanLike.
De controles werken tegen alles wat geen moeite doet, en alles wat wel moeite doet kan erdoor komen. Daarom legt het ontwerp het echte gewicht bij een hertest.
Stap één: alles opnieuw berekenen
Je browser stuurt ons geen WPM. Hij stuurt het toetslogboek (elke keydown-, keyup-, input- en compositiegebeurtenis, met een tijdstempel van de monotone klok performance.now()), de metingen die hij berekende, en een SHA-256-hash van het canonieke resultaat.
De server laat dezelfde meetcode op het logboek los en vergelijkt. Wijkt een getal meer dan 0,01 af, dan wordt het resultaat afgewezen als metrics_mismatch. Klopt de hash niet, dan wordt het afgewezen als hash_mismatch. Een browserextensie die het WPM-veld aanpast, de meest voorkomende vorm van valsspelen op sites die de client vertrouwen, valt hier door de mand. Dezelfde functies maken het getal op je scherm en in de database, en daarom kan onze pagina over de meetwaarden beloven dat het uitgewerkte voorbeeld tot op twee decimalen te reproduceren is.
Waarom de test niet op de server timen? Dan zou je score het netwerk bevatten. Elke aanslag zou ons iets te laat bereiken, met een vertraging die afhangt van je verbinding, en een snelle typist op een trage lijn zou snelheid verliezen die hij echt had. Het logboek geeft ons de klok van de client voor nauwkeurigheid en de herberekening op de server voor eerlijkheid.
Stap twee: klopt het logboek?
Vóór elke timinganalyse komen eenvoudige controles op de vorm van de inzending:
- De test moet minstens 15 seconden of 10 woorden duren. Kortere runs zijn te onrustig om te rangschikken en het makkelijkst op te blazen.
- Een resultaat kan niet binnenkomen voordat de test klaar had kunnen zijn: het begin plus de eigen duur. Een resultaat van 60 seconden dat twintig seconden na de start binnenkomt, is niet gebeurd.
- Het aantal gebeurtenissen moet passen bij het aantal getypte tekens.
- Op desktop moet elke inputgebeurtenis binnen 50 ms op een keydown volgen. Dat vangt geplakte tekst, gescripte inputgebeurtenissen en de meeste tools die toetsaanslagen injecteren, want die vuren tekst af zonder fysieke toets. Typen via een invoermethode-editor (IME-compositie) is uitgezonderd, en resultaten op een telefoon blijven buiten de openbare ranglijsten.
- Een logboek zonder begin, zonder einde of met niet-monotone tijdstempels is ongeldig en wordt meteen afgewezen.
Niets hiervan is slim, maar het haalt het grootste deel van de massa weg.
Stap drie: wat kan de timing van toetsaanslagen onthullen?
Dit is het deel dat we bewust niet volledig documenteren: de lijst met kenmerken is openbaar, de grenswaarden en gewichten niet. Een gepubliceerde grenswaarde is een doelwit. Als we zouden zeggen "een standaarddeviatie onder N milliseconden wordt gemarkeerd", dan zou de volgende versie van elk script N plus één gebruiken. De kenmerken die we beoordelen:
De gemiddelde tijd tussen toetsen en hoeveel die varieert. Menselijk typen is onregelmatig. In de studie van Dhakal en collega's uit 2018 onder 168.960 typisten was de gemiddelde tijd tussen toetsen ongeveer 239 ms, met een standaarddeviatie van ongeveer 112 ms. Een script dat met een vaste tussenpoos typt, varieert bijna niet; een arXiv-studie uit 2025 naar een CAPTCHA op basis van toetsaanslagen zag precies dat bij haar testbot, die typte met een vaste vertraging van 50 ms. Dit is ons sterkste signaal, en het signaal waar onze hulpfunctie op struikelde.
Het aandeel tussentijden onder 40 ms. Een tussentijd van 40 ms, volgehouden, is 1.500 tekens per minuut, of 300 WPM bij vijf tekens per woord. Vingers maken wel losse tussentijden die zo kort zijn wanneer ze toetsen laten overlappen tijdens rollover, dus één korte tussentijd betekent niets. Een logboek waarin een groot deel van de tussentijden zo kort is, is geen typen.
Indruktijden van toetsen. Echte vingers variëren met tientallen milliseconden; synthetische gebeurtenissen hebben vaak identieke indruktijden of indruktijden van bijna nul, omdat de tool keydown en keyup direct na elkaar afvuurt.
Rolloverratio. Hoe vaak de volgende toets omlaag gaat voordat de vorige omhoog komt. Dhakal mat een gemiddelde rolloverratio van 25%, waarbij de meeste snelle typisten bij 40 tot 70% van de aanslagen overrolden en toetsen gemiddeld 30 ms overlapten. Langzame typisten doen het bijna niet, dus een snel resultaat zonder rollover valt op. Bots laten toetsen zelden overlappen.
De langste pauze, schommelingen in snelheid van seconde tot seconde, en het aandeel tussentijden boven één seconde. Mensen aarzelen op manieren die je een script expliciet moet leren nadoen.
Een scoremodel combineert deze kenmerken en kan een resultaat als verdacht markeren. Onder 130 WPM wijst een markering op zichzelf niets af. Je resultaat wordt nooit voor je verborgen; deze controles bepalen alleen of het op de ranglijst komt.
Kan valsspelen bij een typtest langs timingcontroles komen?
Ja, als het valsspelen met zorg is gebouwd. Een arXiv-artikel van David Condrey uit januari 2026 testte detectoren op basis van toetstiming die door mensen getypte tekst moesten onderscheiden van door AI gegenereerde tekst. Volledig geautomatiseerde injectie onderscheidden ze perfect, maar aanvallen met menselijke timing (iemand die AI-tekst overtypt, of een programma dat vertragingen trekt uit menselijke typedata) ontsnapten aan alle vijf classificatoren in minstens 99,8% van de gevallen. Het artikel gaat over het vaststellen van auteurschap, niet over typtests, maar de les gaat ook hier op: stap drie vangt de slordigen en weinig meer.
Onze eigen hulpfunctie maakt hetzelfde punt op kleine schaal: willekeurige jitter en een paar pauzes brachten haar van overduidelijk synthetisch naar aannemelijk.
Stap drie is dus een filter. Het oordeel komt uit stap vier.
Stap vier: de verificatietest
Is een getimed resultaat hoger dan 130 WPM en oogt de timing ook ongebruikelijk, dan zie je het en wordt het opgeslagen, maar het blijft van de openbare ranglijsten tot je een verificatietest haalt. Dat is een nieuwe test van 30 seconden, en je moet minstens 75% halen van de snelheid die je claimde. Een eenmalige meevaller of een geleend logboek overleeft geen tweede run.
Waarom 130 WPM? Het is ongeveer tweeënhalf keer het gemiddelde van 51,56 WPM in de data van Dhakal, ver boven de meeste typisten, en wie echt zo snel typt, kan het twee keer. Een plotseling snel resultaat met vreemde timing is precies wat een geleend logboek of een script oplevert, en als het eerlijk is, is één extra test een kleine prijs.
De hertest is een gewone typtest, met gewone tekst, geen vervormde afbeelding of een pagina vol vreemde symbolen. Moeilijk leesbare tekst maakt iedereen langzamer, en de mensen die er het meest door vertraagd worden, zijn precies de eerlijke snelle typisten die de hertest moet vrijpleiten. Een verificatie waarvoor eerlijke snelle typisten zakken, is erger dan geen verificatie. Gewone tekst maakt de controle ook eerlijk: het logboek van de hertest gaat door dezelfde timingcontroles als elk ander resultaat.
Limieten en blokkades
Inzendingen zijn begrensd: dertig per minuut per ingelogde gebruiker, zestig per IP-adres. Een account dat steeds op de controles stuit, krijgt een shadowban, wat betekent dat het stilletjes van de ranglijsten wordt verborgen, en drie ernstige anti-cheatgebeurtenissen binnen 24 uur leiden daar automatisch toe. Doordat gebeurtenissen binnen een tijdvenster worden geteld, kost één vreemd resultaat je nooit een account, terwijl een script dat keer op keer zakt snel stopt.
De ranglijsten aller tijden vereisen bovendien 30 minuten typen op het account, zodat een vers account met één perfecte run er niet bovenaan kan komen.
Waardoor je per ongeluk gemarkeerd wordt
De meeste gemarkeerde resultaten zijn geen valsspelen. De eerlijke manieren om op een controle te stuiten:
Autocorrectie op een telefoon. Een vervanging komt binnen als één inputgebeurtenis die meerdere tekens verandert. We tellen haar als één toetsaanslag, markeren haar en houden het resultaat met een notitie van de openbare ranglijsten, zonder het af te wijzen.
Geplakte tekst. Plakken is geblokkeerd, en een resultaat waarbij het geprobeerd is, wordt van de ranglijsten uitgesloten.
Van tabblad wisselen. Als de focus tijdens een test langer dan twee seconden van de pagina weg is, wordt de test als onderbroken gemarkeerd; hij wordt opgeslagen en getoond, maar niet gerangschikt.
Pauzeren. Een onderbreking van meer dan vijf seconden in een woorden- of citaattest markeert het resultaat als gepauzeerd. Zelfde behandeling.
IME-compositie. Japanse, Koreaanse en Chinese invoer komt binnen via compositiegebeurtenissen, dus daarvoor slaan we de keydown-regel over. Ziet er dan toch iets verkeerd uit, dan is dat een bug, en dan willen we graag het logboek.
Offline resultaten. Een resultaat dat meer dan tien minuten na afloop gesynchroniseerd wordt, blijft ongerangschikt in je geschiedenis, omdat we de klok ervan niet kunnen valideren.
Echt snel zijn. Boven 130 WPM kom je de hertest tegen, waarschijnlijk op je eerste goede dag.
Hoe je bezwaar maakt
Bij elke uitsluiting staat de reden in je geschiedenis. Denk je dat we ons vergissen over een resultaat of een beperking, mail dan naar het bezwaaradres op onze pagina over valsspeeldetectie, vanaf het adres van je account, met de link naar het resultaat of de datum en tijd van de test. Een mens bekijkt de herhaling van de toetsaanslagen en antwoordt binnen een paar dagen. Over bezwaren beslist nooit alleen het geautomatiseerde model.
Hebben we zojuist een handleiding gepubliceerd om door de controles te komen? Gedeeltelijk. De lijst met kenmerken was altijd al af te leiden uit het gedrag, en de grenswaarden blijven geheim. De hertest is het deel dat ertoe doet, en de manier om daarvoor te slagen is typen.
Veelgestelde vragen
Hoe sporen typtests bots op?
Goede typtests lezen het toetslogboek: of elk teken een toetsaanslag achter zich heeft, hoeveel de tussentijden tussen toetsen variëren, en hoe toetsen worden vastgehouden en overlappen. Scripts zijn meestal te regelmatig; zorgvuldige bots kunnen mensen nadoen, en daarom voegen we een hertest toe.
Kan een bot door de valsspeeldetectie van een typtest komen?
Een zorgvuldige bot kan door timingcontroles komen: onderzoek naar detectoren op basis van toetstiming vond dat vervalste menselijke timing er bijna altijd langs kwam. Daarom houden we snelle resultaten vast voor een hertest, waarvoor een bot opnieuw moet slagen met een tweede logboek dat door dezelfde controles komt.
Waarom kwam mijn typtestresultaat niet op de ranglijst?
Meestal door een test korter dan 15 seconden of 10 woorden, een pauze van meer dan vijf seconden, een tabbladwissel, of een resultaat boven 130 WPM dat op zijn hertest wacht. Je geschiedenis toont de reden.