{"openapi":"3.1.0","info":{"title":"Keyboard Layout API","version":"1.0.0","description":"Re-map text between keyboard layouts — the fix for text typed with the keyboard set to the wrong layout. The remap endpoint takes text, a source layout and a target layout, and rewrites each character to the one produced by the same physical key on the other layout. So text accidentally typed on a Dvorak-configured keyboard while you meant QWERTY (or the reverse) is recovered exactly, and because the mapping is position-preserving it round-trips perfectly. It supports QWERTY (US), Dvorak and Colemak, including the shifted symbols, and leaves characters that are not on a remappable key (spaces and accents) untouched. The layouts endpoint returns the full key map for each layout. Everything is computed locally and deterministically, so it is instant and private. Ideal for fixing wrong-layout typing, building text editors and IME tools, layout-learning aids, and cross-layout search. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This remaps between keyboard layouts; for classical ciphers (Caesar, ROT13, Morse) use a cipher API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/keyboardlayout-api","description":"oanor gateway"}],"tags":[{"name":"Keyboard"},{"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/layouts":{"get":{"operationId":"get_v1_layouts","tags":["Keyboard"],"summary":"List supported layouts","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"count":3,"layouts":[{"name":"QWERTY (US)","slug":"qwerty","lower_row":"`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./","upper_row":"~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?"},{"name":"Dvorak (US)","slug":"dvorak","lower_row":"`1234567890[]',.pyfgcrl/=\\aoeuidhtns-;qjkxbmwvz","upper_row":"~!@#$%^&*(){}\"<>PYFGCRL?+|AOEUIDHTNS_:QJKXBMWVZ"},{"name":"Colemak (US)","slug":"colemak","lower_row":"`1234567890-=qwfpgjluy;[]\\arstdhneio'zxcvbkm,./","upper_row":"~!@#$%^&*()_+QWFPGJLUY:{}|ARSTDHNEIO\"ZXCVBKM<>?"}]},"meta":{"timestamp":"2026-06-03T17:42:13.394Z","request_id":"8aec397b-15ef-43c2-b17c-1bdf6243ccea"},"status":"ok","message":"Layouts","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/remap":{"get":{"operationId":"get_v1_remap","tags":["Keyboard"],"summary":"Remap text between layouts","description":"","parameters":[{"name":"text","in":"query","required":true,"description":"The text to convert","schema":{"type":"string"},"example":"hello"},{"name":"from","in":"query","required":false,"description":"Source layout (default qwerty)","schema":{"type":"string"},"example":"qwerty"},{"name":"to","in":"query","required":true,"description":"Target layout","schema":{"type":"string"},"example":"dvorak"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"to":"dvorak","from":"qwerty","input":"hello","result":"d.nnr","remapped_chars":5,"unchanged_chars":0},"meta":{"timestamp":"2026-06-03T17:42:13.503Z","request_id":"bc6d43c8-1440-4bd6-8bcb-b371e24e093d"},"status":"ok","message":"Remap layout","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":"Keyboard Layout API","notes":"Position-preserving substitution over the 47 main keys (unshifted + shifted). remap(from,to) then remap(to,from) round-trips. Nothing is stored.","version":"v1","endpoints":[{"path":"/v1/remap","params":{"to":"target layout","from":"source layout (default qwerty)","text":"the text to convert"},"returns":"the remapped text"},{"path":"/v1/layouts","params":[],"returns":"the supported layouts and their key maps"},{"path":"/v1/meta","params":[],"returns":"this document"}],"description":"Re-map text between keyboard layouts — the fix for text typed with the keyboard set to the wrong layout. The remap endpoint takes text, a source layout and a target layout, and rewrites each character to the one produced by the same physical key on the other layout. So text accidentally typed on a Dvorak-configured keyboard while you meant QWERTY (or the reverse) is recovered exactly, and because the mapping is position-preserving it round-trips perfectly. It supports QWERTY (US), Dvorak and Colemak, including the shifted symbols, and leaves characters that aren't on a remappable key (spaces and accents) untouched. The layouts endpoint returns the full key map for each layout. Everything is computed locally and deterministically, so it is instant and private. Ideal for fixing wrong-layout typing, building text editors and IME tools, layout-learning aids, and cross-layout search. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This remaps between keyboard layouts; for classical ciphers (Caesar, ROT13, Morse) use a cipher API.","supported_layouts":["qwerty","dvorak","colemak"]},"meta":{"timestamp":"2026-06-03T17:42:13.619Z","request_id":"70325464-be5e-48d6-ba81-195bd93a332a"},"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":6435,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":795,"monthly_call_quota":15950,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2785,"monthly_call_quota":210500,"rps_limit":20,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":6585,"monthly_call_quota":1095000,"rps_limit":50,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/keyboardlayout-api"}