ROT13 encoder
Hello, World! becomes Uryyb, Jbeyq! and the same step turns it back: every Latin letter moves 13 places while punctuation stays put. Handy for hiding spoilers and puzzle answers, never for real secrets. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Text
- Hello, World!
- Result
- Uryyb, Jbeyq!
- Length
- 13
- Letters rotated
- 10
ROT13 is the classic letter-substitution cipher that rotates every Latin letter thirteen places in the alphabet while leaving digits, spaces, and punctuation untouched. Because the alphabet has twenty-six letters, applying the same rotation twice restores the original text, so one deterministic operation both encodes and decodes. People use ROT13 to hide spoilers in forums, lightly obfuscate puzzle answers, teach Caesar ciphers in classrooms, and sanity-check string pipelines without installing crypto libraries.
How ROT13 turns letters around
ROT13 replaces each letter with the one thirteen places further along the alphabet, wrapping round from Z back to A. A becomes N, N becomes A, and Hello becomes Uryyb. Because the Latin alphabet has twenty-six letters, thirteen is exactly half of it, so moving thirteen places twice lands you back where you started. That is why one single operation both hides and reveals a message: paste the original to scramble it, paste the scrambled version to read it. Upper and lower case rotate separately, so capitals stay capitals.
When ROT13 is useful, and when it is not
ROT13 dates back to the Usenet era and is still used in forums to hide spoilers, so readers can choose whether to decode them. It also turns up in riddle answers, Easter eggs and classroom lessons on Caesar ciphers. It is not encryption: anyone who knows the trick reverses it instantly, so never use it for passwords or personal data. A common surprise is that numbers and punctuation do not change, and accented letters stay as they are, so a message full of digits remains readable.
Encode, decode, validation rules, and common pitfalls
There is no separate encode or decode mode: the same request shape performs both directions. Paste plaintext spoilers to hide them, or paste already-rotated text to reveal them. Mixed-case phrases preserve case because upper and lower alphabets rotate independently.
Non-ASCII letters such as accented Latin or Cyrillic are not rotated by classical ROT13; they pass through so the algorithm stays faithful to the Usenet-era definition people search for. Do not treat the result as encryption: anyone who knows the scheme can reverse it instantly, and the product page should never market ROT13 as a security control for secrets, passwords, or personal data.
Prefer this landing when the search intent is literally rot13 encoder or rot13 cipher; general Caesar shift calculators and Base64 or hex encoders answer different intents and should stay separate tools.
What you can do with it
Spoiler and puzzle obfuscation
Hide spoilers, riddle answers, and Easter eggs in ROT13 so readers can opt in, then reverse the same string with one more call.
FAQ
How do I encode text with ROT13?
The response result field holds the rotated string; method is always rot13.
How do I decode ROT13?
Use the same request. ROT13 is its own inverse: paste the rotated text into text and the result is the original Latin-letter content.
Is the ROT13 encoder free?
The browser tool runs free on your device.
Does ROT13 encrypt my secrets safely?
No. ROT13 is a trivial reversible substitution meant for spoilers and teaching, not confidentiality. Never use it for passwords or sensitive data.
Does ROT13 change accented letters or other alphabets?
No. Only the plain letters A to Z, in upper and lower case, are rotated. Accented Latin letters, Cyrillic and other scripts pass through untouched, which matches the classic definition of ROT13.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/enc/rot13 \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello, World!"}'const res = await fetch("https://api.kit.forhosting.com/enc/rot13", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello, World!"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/rot13",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello, World!"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/rot13", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello, World!"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello, World!"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/rot13", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "Hello, World!"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.rot13",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
This capability takes a non-empty text field, returns the transformed string with counts of rotated letters, and rejects empty input with a clear invalid_input error.
How ROT13 works and what the response contains
ROT13 is a Caesar cipher with a fixed shift of thirteen. Uppercase letters A through Z map to N through Z then A through M; lowercase letters a through z follow the same modular rotation within their own alphabet. Characters outside those ranges—digits, punctuation, whitespace, emoji, and non-Latin scripts—pass through unchanged so messages keep their shape. Send a JSON body with the required string field text set to any non-empty message; aliases input, value, and s are accepted when clients reuse older form names. Empty strings fail immediately with invalid_input because there is nothing meaningful to transform and the product promise is a real substitution result. On success the response includes result with the transformed text, method equal to rot13 so downstream code can branch without sniffing shapes, length equal to the input character count, and letters_rotated counting how many A–Z or a–z units actually moved. Identical inputs always produce identical JSON because the path is pure character arithmetic with no network, no random seed, and no wall clock. Use letters_rotated when you want to assert that punctuation-heavy strings still processed correctly without inventing a second mode field.
Encode, decode, validation rules, and common pitfalls
Missing text, non-string text, or an empty string all raise invalid_input and are not charged on the prepaid API. Whitespace-only strings that still have length greater than zero are accepted; only letters rotate, so a string of spaces returns itself with letters_rotated equal to zero.
API usage, pricing, classroom workflows, and practical limits
Call the free in-browser rot13 encoder for forum spoilers, puzzle drafting, lecture demos, and one-off checks without installing openssl or writing a one-liner in every language. A typical classroom workflow shows students that shifting by thirteen twice returns the original message, then contrasts that with a true keyed cipher later in the syllabus. Support playbooks can reverse lightly obfuscated ticket notes that staff intentionally wrote in ROT13. Pair with Base64 or URL-encoding tools only when a later transport step needs a different alphabet—keep ROT13 on its own landing so SEO intent stays sharp. Use the prepaid KIT API when a backend, serverless function, tutoring platform, or SDK needs a stable contract under balance at $0.002 per successful item; validation failures never consume balance after the engine rejects the request. Puzzle sites can precompute answers for display and reveal them on demand with the same endpoint. Authors shipping SDKs can map the result field straight into a copy button while method and letters_rotated make OpenAPI examples self-explanatory. Keep payloads to ordinary text sizes appropriate for a Worker isolate item call; this tool is for messages and snippets, not multi-megabyte binary blobs.
Integration use cases
Classroom Caesar-cipher demos
Teachers show that a fixed shift of thirteen is an involution: encode, decode, and compare letters_rotated without installing a CAS or crypto library.
Pipeline and CI fixtures
Scripts and continuous-integration tests pin deterministic ROT13 outputs so accidental alphabet or case-handling changes fail fast.
Technical questions
What happens if text is empty?
The request fails with invalid_input. A non-empty string is required; empty input is not charged on the prepaid API.