German number to words
Type 21 and get einundzwanzig: the converter writes whole numbers from 0 to 999999 as German words, with the unit before the ten and hundert and tausend joined into the same word. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- N
- 21
- Language
- de
- Words
- einundzwanzig
Convert integer 0..999999 to German cardinal words. Search intent: number to words german. No network calls or random seeds are required. Failed jobs are not billed.
How German builds its number words
German writes every number below a million as a single word, and for the last two digits it says the unit first and the ten second. For 21 that means the unit, then und, then the ten: einundzwanzig, literally one-and-twenty. Hundreds and thousands are stacked in front with hundert and tausend, so a six-digit number becomes one long compound. The converter applies those rules to any whole number from 0 to 999999 and hands back the finished word, so there is no need to count syllables or wonder where a space might go.
When it helps, and the slips it prevents
It is handy for language learners checking homework, for teachers preparing exercises with the answers written out, and for anyone who has to spell a figure in words in a German document or form. The most common slips are putting the ten before the unit, as English does, splitting the number into separate words, and forgetting the und in the part below 100. Each result comes from the same fixed rules, so the same number always produces the same spelling, with no network call and nothing left to chance.
What you can do with it
Teaching
Pinned goldens.
FAQ
Which numbers can I convert to German words?
Whole numbers from 0 to 999999. Decimals, negative numbers and anything larger fall outside that range and are not converted, so the result is always an exact German cardinal number.
Where does und go in a German number?
Between the unit and the ten, with the unit said first: German says one-and-twenty rather than twenty-one. Every ten from twenty to ninety is linked this way, including at the end of larger numbers.
How are hundreds and thousands written in German?
They are attached to the rest of the number with no spaces: hundert for the hundreds and tausend for the thousands, each with its multiplier in front. That is why the converter writes 100 as einhundert and 1000 as eintausend.
Will the same number always give the same words?
Yes. The conversion needs no network call and has nothing random in it, so the same number always returns exactly the same German spelling, which makes it safe for answer keys.
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/math/number-to-words-de \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"n":21}'const res = await fetch("https://api.kit.forhosting.com/math/number-to-words-de", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"n": 21
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/number-to-words-de",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"n": 21
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/number-to-words-de", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"n":21}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"n":21}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/number-to-words-de", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"n": 21
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.number_to_words_de",
"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
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS hooks, automation, or teaching demos.
How it works
Convert integer 0..999999 to German cardinal words. Und-linking under 100; hundert/tausend compounding. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS hooks, automation, or teaching demos.
Inputs, limits and rounding
Optional decimals use half-up once. Optional output fields are omitted, never null. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Provide required JSON fields with DOM-safe names. Invalid types raise invalid_input. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS hooks,
When to use it
Use when search intent matches. Convert integer 0..999999 to German cardinal words. EN-only delivery; Nitro hydrates locales. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS hooks, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS hooks, automation, or teaching demos.
Integration use cases
Quick check
Free widget.
Automation
API same JSON.
Technical questions
Free?
Yes tier A.
Network?
No.
Bad input?
invalid_input.
API?
Yes.
Locales?
EN-only; Nitro hydrates.