{"openapi":"3.1.0","info":{"title":"Typing Speed API","version":"1.0.0","description":"Measure typing speed and accuracy. Compute words-per-minute, characters-per-minute and accuracy from a character (or word) count and the elapsed time, optionally subtracting uncorrected errors for a net WPM; compare what was typed against a reference text to count per-character mistakes and score the attempt; and estimate how long a given amount of text will take at a target speed. Uses the standard typing convention that one word equals five characters. Perfect for typing tests and games, coding-speed tools, onboarding and skills assessments, and leaderboards. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 4 endpoints. A focused typing calculator, distinct from general unit or percentage maths.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/wpm-api","description":"oanor gateway"}],"tags":[{"name":"Typing"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/from-text":{"get":{"operationId":"get_v1_from_text","tags":["Typing"],"summary":"WPM + accuracy from typed text","description":"","parameters":[{"name":"typed","in":"query","required":true,"description":"What was typed","schema":{"type":"string"},"example":"the quick brown fox"},{"name":"reference","in":"query","required":false,"description":"The target text","schema":{"type":"string"},"example":"the quick brown fox"},{"name":"time_seconds","in":"query","required":true,"description":"Elapsed seconds","schema":{"type":"string"},"example":"15"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"cpm":76,"errors":0,"net_wpm":15.2,"gross_wpm":15.2,"characters":19,"time_seconds":15,"accuracy_percent":100,"correct_characters":19},"meta":{"timestamp":"2026-06-03T01:09:40.195Z","request_id":"4f5f302b-f6c2-4de8-bdf7-5475bb791dec"},"status":"ok","message":"WPM + accuracy from typed text","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/time":{"get":{"operationId":"get_v1_time","tags":["Typing"],"summary":"Time to type N words","description":"","parameters":[{"name":"words","in":"query","required":true,"description":"Number of words","schema":{"type":"string"},"example":"100"},{"name":"wpm","in":"query","required":true,"description":"Target WPM","schema":{"type":"string"},"example":"50"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"wpm":50,"words":100,"minutes":2,"seconds":120},"meta":{"timestamp":"2026-06-03T01:09:40.279Z","request_id":"798acdbc-407a-416b-96ca-e58738fd74fb"},"status":"ok","message":"Time to type N words","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/wpm":{"get":{"operationId":"get_v1_wpm","tags":["Typing"],"summary":"WPM from characters + time","description":"","parameters":[{"name":"characters","in":"query","required":false,"description":"Typed characters (or use words)","schema":{"type":"string"},"example":"300"},{"name":"words","in":"query","required":false,"description":"Typed words (alternative)","schema":{"type":"string"}},{"name":"time_seconds","in":"query","required":true,"description":"Elapsed seconds","schema":{"type":"string"},"example":"60"},{"name":"errors","in":"query","required":false,"description":"Uncorrected errors","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"cpm":300,"errors":0,"net_wpm":60,"gross_wpm":60,"characters":300,"time_seconds":60,"accuracy_percent":100},"meta":{"timestamp":"2026-06-03T01:09:40.369Z","request_id":"229709c7-c5a6-41e3-ac26-78382201b507"},"status":"ok","message":"WPM from chars + time","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"name":"Typing Speed API","notes":"Gross WPM = (characters / 5) / minutes. Net WPM subtracts uncorrected errors per minute. Nothing is stored.","version":"v1","endpoints":[{"path":"/v1/wpm","params":{"errors":"uncorrected errors (optional)","characters":"typed chars (or words)","time_seconds":"elapsed seconds (required)"},"returns":"gross/net WPM, CPM, accuracy"},{"path":"/v1/from-text","params":{"typed":"what was typed (required)","reference":"the target text (optional)","time_seconds":"required"},"returns":"WPM and accuracy, counting per-character errors"},{"path":"/v1/time","params":{"wpm":"required","words":"required"},"returns":"minutes/seconds to type that many words"},{"path":"/v1/meta","params":[],"returns":"this document"}],"description":"Calculate typing speed and accuracy. Get words-per-minute, characters-per-minute and accuracy from a character count and a time (with optional errors); compare typed text against a reference to count mistakes and score it; and estimate how long a given amount of text takes at a target WPM. Uses the standard 1 word = 5 characters convention. Pure local, no key."},"meta":{"timestamp":"2026-06-03T01:09:40.463Z","request_id":"3da805e9-7657-43ce-8385-a9e8eebdfbfa"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":1145,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":185,"monthly_call_quota":9850,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2175,"monthly_call_quota":149500,"rps_limit":20,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":5975,"monthly_call_quota":790000,"rps_limit":50,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/wpm-api"}