Count letters only
Hello, World! 123 — café Ωmega 🚀 has 19 letters: digits, spaces, punctuation and the emoji are skipped, while é and the Greek Ω count like any other letter. Handy for word games, worksheets and data checks. 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! 123 — café Ωmega 🚀
- Letter count
- 19
This letters-only counter gives you one clean total for the alphabetic letters in a piece of text. It ignores digits, spaces, line breaks, punctuation, emoji, currency marks, mathematical signs, and other symbols, so noisy content does not inflate the answer. Unlike an ASCII-only check, it recognizes letters from Unicode writing systems, including accented Latin characters and letters used in Greek, Cyrillic, Arabic, and many other scripts. That makes the result useful for word games, classroom exercises, editorial checks, data cleaning, and deterministic software tests. The calculation runs as a fixed local scan with no network request, randomness, or date-dependent behavior.
What the letters-only total includes
The result counts characters whose Unicode general category is Letter. That category includes ordinary uppercase and lowercase alphabetic characters, titlecase letters, modifier letters, and letters used in writing systems that do not follow the English A-to-Z pattern. For example, the accented character é counts as one letter, Greek Ω counts as one letter, and Arabic ك counts as one letter.
A combining accent entered separately does not add another letter because the mark itself is not classified as a letter; the underlying alphabetic character still counts. Digits never contribute, whether they appear inside a product code, beside a word, or on their own. Spaces, tabs, line breaks, commas, periods, apostrophes, quotation marks, dashes, brackets, mathematical operators, currency signs, emoji, and decorative symbols are also ignored.
The original text is not transformed, normalized, corrected, or returned as a filtered copy. It is scanned exactly as submitted, and only membership in the Unicode Letter category affects the total.
How to enter text and interpret edge cases
The string may contain sentences, multiple lines, codes, punctuation, or symbols, and those non-letter parts can remain in place because the counter skips them automatically. The algorithm iterates by Unicode code point, which prevents a supplementary-plane character from being split into two iterations. It then applies the standard Unicode Letter property to each code point.
No locale is guessed, no dictionary is consulted, and letter case has no effect. Because the scan uses no network, current time, random value, or mutable state, identical input produces identical output across repeated calls.
Using clean letter totals in games and analysis
A letters-only count is useful whenever formatting and incidental characters should not affect a measurement. Word-game designers can compare clue lengths after removing the visual noise of numbering, spaces, and punctuation without first building a sanitized copy. Teachers can check answers in alphabet exercises, prepare reproducible worksheet keys, or demonstrate the difference between letters and all characters in a sentence.
Editors and researchers can measure alphabetic content in labels, survey answers, headlines, or imported records that contain identifiers and markup-like punctuation. Data-cleaning workflows can flag records that return zero even though the original field is non-empty, revealing rows made entirely of digits or symbols. Use a dedicated character counter when spaces and punctuation should contribute, or a text-cleaning tool when you need filtered text rather than an integer total.
What you can do with it
Check word-game material
Measure only the playable alphabetic content in clues, phrases, and answers while ignoring numbering and punctuation.
Audit mixed-format data
Find how much alphabetic content remains in product labels, survey fields, and imported records containing digits or symbols.
FAQ
How much does the letters-only counter cost?
It is free to use in the browser.
Do accented and non-English letters count?
Yes. The counter uses the Unicode Letter property, so accented Latin letters and letters from many other writing systems count.
Are numbers, spaces, and punctuation included?
No. Digits, whitespace, punctuation, emoji, currency marks, mathematical signs, and other symbols are ignored.
Can the result be zero?
Yes. Text made only of digits, spaces, punctuation or emoji has no letters, so it returns zero, which is often exactly what a data check needs. A completely empty box is refused instead of reported as zero.
Do uppercase and lowercase letters both count?
Yes, letter case has no effect: A and a each add one letter. The counter only asks whether a character is a letter, in any alphabet, and leaves everything else out.
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/str/char-count-letters-only \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello, World! 123"}'const res = await fetch("https://api.kit.forhosting.com/str/char-count-letters-only", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello, World! 123"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/char-count-letters-only",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello, World! 123"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/char-count-letters-only", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello, World! 123"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello, World! 123"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/char-count-letters-only", 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! 123"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.char_count_letters_only",
"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_chars | 100000 |
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
Use the browser tool interactively, or call the API for $0.002 per successful request when the same counting rule must be automated.
What the letters-only total includes
The response deliberately contains a single letter_count plus a fixed method label, instead of mixing this focused measurement with word, byte, vowel, or total-character statistics. This narrow contract makes the number easy to interpret in puzzles, rubrics, and automated assertions.
How to enter text and interpret edge cases
Provide the source in the required text field as a JSON string or paste it into the matching browser control. An empty string is rejected with invalid_input so an accidentally blank submission cannot be mistaken for a meaningful zero. A non-empty string containing only spaces, digits, punctuation, or emoji is valid and returns letter_count zero, which is often exactly the finding needed when validating noisy data. Values such as arrays, objects, booleans, and numbers are rejected instead of being silently converted into text; this avoids surprising results such as counting letters in the word true when the caller intended a Boolean value. Input is limited to one hundred thousand JavaScript characters to keep browser and Worker execution bounded.
Using clean letter totals in games and analysis
The browser version is convenient for one-off checks, while each successful API request costs $0.002 and applies the same deterministic algorithm. This tool does not count words, syllables, grapheme clusters, vowels, consonants, or every visible character, and it does not remove unwanted characters from the input.
Integration use cases
Build deterministic tests
Generate stable Unicode-aware letter totals for validators, golden fixtures, classroom software, and CI assertions.
Technical questions
Can a valid result be zero?
Yes. A non-empty string containing no alphabetic letters returns letter_count zero. An empty string is invalid input.
Does the tool return text with non-letters removed?
No. It returns a numeric letter_count and a method label. It does not modify or return a filtered version of the source text.