Count lowercase letters in text
Hello, world! 123 — café holds 13 lowercase letters: the capital H, the digits, the spaces and the punctuation are left out, while the accented é counts. A quick casing check for headings, labels and identifiers. 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é
- Lowercase count
- 13
The lowercase letter counter measures exactly how many lowercase letters appear in a piece of text. It ignores uppercase letters, numbers, spaces, punctuation, emoji, and other symbols, giving you a focused result for case-distribution checks. Unlike a basic character counter, it recognizes lowercase letters across Unicode, so common accented and non-English lowercase forms are included.
Measure lowercase usage without unrelated characters
A general character total cannot tell you whether text follows the casing pattern you intended. This counter isolates lowercase letters and returns one clear number, leaving uppercase letters, digits, whitespace, punctuation, emoji, and symbols outside the result. That makes it useful when a text contains many separators or numbers that would distort an ordinary length measurement.
Paste the source exactly as it appears; spaces, line breaks, quotation marks, and formatting punctuation can remain in place because they do not contribute to the count. An empty string is valid and produces zero, which is convenient for forms and pipelines that may legitimately contain blank values. The result is deterministic, so identical text always produces the same value.
Use it to compare drafts, inspect labels, check generated copy, or establish a simple numeric signal before applying a stricter style rule. It reports evidence about lowercase usage rather than modifying the source, preserving the text you supplied for any later review or transformation.
Understand what qualifies as a lowercase letter
The algorithm uses the Unicode lowercase-letter category rather than limiting the test to the English characters a through z. As a result, lowercase letters with accents and lowercase forms from scripts that define case are counted correctly. Uppercase and titlecase forms are excluded, even when they resemble their lowercase partners.
Letters from writing systems without a lowercase and uppercase distinction are also excluded because calling them lowercase would be misleading. Each Unicode code point is inspected once, which means supplementary characters are not accidentally split into two JavaScript code units during classification. Combining marks are not letters by themselves: in a decomposed sequence, the lowercase base letter counts while its separate accent mark does not.
This definition provides a stable, language-aware answer while keeping the output easy to interpret. If your task instead needs all letters regardless of case, or every character including punctuation, use a broader letter or character counter; this capability intentionally answers only the narrow lowercase question.
Use the count in formatting and quality checks
A lowercase total becomes especially useful when you compare it with another known measurement. A heading expected to be all caps should have a lowercase count of zero. A machine identifier governed by a lowercase-only convention can be checked by combining this result with separate checks for invalid characters.
Editors can compare versions of marketing copy to spot unexpected casing changes, while developers can sample interface labels or localized resources before a release. Data teams can run the counter over individual fields to find values that deserve review without changing or normalizing the source. In both paths the same pure algorithm runs without network lookups, random behavior, or time-dependent results.
What you can do with it
Audit all-caps headings
Confirm that a heading intended to be uppercase contains zero lowercase letters before publication.
Review generated text
Track lowercase usage in generated labels or responses as a quick signal for unexpected casing changes.
Inspect structured values
Measure lowercase letters in identifiers, filenames, or imported fields without counting digits and separators.
FAQ
What does the counter include?
It includes Unicode characters classified as lowercase letters, including many accented and non-English lowercase forms.
Are uppercase letters and numbers counted?
No. Uppercase and titlecase letters, numbers, whitespace, punctuation, emoji, and symbols are ignored.
Does an empty text value cause an error?
No. An empty string is valid and returns a lowercase count of zero; a missing or non-string text field is rejected.
How are letters from scripts without case handled?
They are not counted because those scripts do not classify their letters as lowercase.
How can I check that a heading is written entirely in capitals?
Paste the heading and look at the result: a heading that is fully in capitals gives zero. Any higher number tells you exactly how many lowercase letters slipped in, accented ones included.
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-lowercase \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello, world! 123 — café"}'const res = await fetch("https://api.kit.forhosting.com/str/char-count-lowercase", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello, world! 123 — café"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/char-count-lowercase",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello, world! 123 — café"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/char-count-lowercase", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello, world! 123 — café"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello, world! 123 — café"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/char-count-lowercase", 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 — café"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.char_count_lowercase",
"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
Paste a heading, paragraph, identifier, data sample, or generated response to inspect its casing quickly, or call the same deterministic counter through the API for repeatable formatting analysis in automated workflows.
Use the count in formatting and quality checks
Keep in mind that this endpoint returns a count, not a pass-or-fail judgment, because the correct amount of lowercase text depends on your own rule and context. It does not infer sentence boundaries, grammar, brand names, or capitalization requirements. Browser use is available for quick checks, while API calls cost $0.002 per request for repeatable automation.
Technical questions
What does an API request cost?
Each API request costs $0.002. You can also run the counter free in your browser on this page.