NATO phonetic alphabet
Type NATO and get November Alfa Tango Oscar, using the official ICAO spellings that radio crews and aviation checklists expect, or paste code words to turn them back into letters and digits. Word boundaries survive the round trip. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Input text
- NATO
- Operation
- Encode
- NATO phonetic result
- November Alfa Tango Oscar
Radios, support desks and aviation checklists still spell callsigns with the ICAO/NATO phonetic alphabet.
Official ICAO spellings, not informal variants
Letters use the standard table: Alfa not Alpha, Juliett with double t, X-ray with a hyphen. Digits map to Zero through Nine. Case is folded on lookup so hello and HELLO produce the same code words, while the output words keep their canonical Title-case form from the fixed table.
Only ASCII letters and digits map; punctuation is dropped on encode and unknown tokens fail hard on decode, which keeps callsigns reproducible across teams.
Encode groups words with a slash separator
Spaces in the input split original words. Inside a word, code words join with a single space; between original words the tool inserts a spaced slash so decode can restore word boundaries. Characters outside A–Z and 0–9 are omitted rather than rejected, which keeps noisy paste input usable for callsigns.
Only ASCII letters and digits map; punctuation is dropped on encode and unknown tokens fail hard on decode, which keeps callsigns reproducible across teams.
Decode is strict on vocabulary
Decode tokenizes on whitespace. A lone slash token starts a new output word. Digits come back as 0–9 and letters as uppercase A–Z.
Only ASCII letters and digits map; punctuation is dropped on encode and unknown tokens fail hard on decode, which keeps callsigns reproducible across teams.
What it accepts and when it stops
Text is required and capped at 2000 characters to protect the free browser session. Only ASCII letters and digits map; punctuation is dropped on encode and unknown tokens fail hard on decode, which keeps callsigns reproducible across teams.
What you can do with it
Radio and aviation drills
Spell callsigns and tail numbers with the official ICAO table before a session.
Support and ticketing
Read confirmation codes aloud without informal Alpha/Juliet variants.
Training materials
Generate answer keys for phonetic spelling exercises.
FAQ
Is it Alfa or Alpha?
Alfa — the ICAO spelling used here, not the informal Alpha variant.
How are digits spelled?
Zero One Two Three Four Five Six Seven Eight Nine.
What happens to punctuation on encode?
It is omitted. Only letters and digits become code words.
How does decode separate words?
A slash token between phonetic words restores a space in the output.
What happens if decoding meets a word that is not in the alphabet?
Decoding stops and names the unknown word instead of guessing. That way a misheard word never turns into a wrong letter inside a callsign or a confirmation code.
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/text/nato-phonetic \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"NATO"}'const res = await fetch("https://api.kit.forhosting.com/text/nato-phonetic", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "NATO"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/nato-phonetic",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "NATO"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/nato-phonetic", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"NATO"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"NATO"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/nato-phonetic", 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": "NATO"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.nato_phonetic",
"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.
Limits
max_text_chars | 2000 |
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 tool encodes plain text into Alfa Bravo words and decodes those words back to characters with the official spellings (Alfa, Juliett, X-ray), matching the free browser tool and the API byte for byte.
Decode is strict on vocabulary
Every other token must be an official NATO word under case-insensitive match; unknown tokens return typed invalid_input naming the bad word.
Integration use cases
Automated checks
Assert encode and decode round-trips in CI fixtures.
Technical questions
What if a token is not NATO?
Decode returns invalid_input; it does not guess.
Is the tool free in the browser?
Yes on desktop and mobile. The native app uses the API at $0.002.