Remove numbers from text
Remove numbers from text without changing its letters, punctuation, spacing, or line breaks.
Run — free
The tool scans the supplied text character by character, deletes every Unicode decimal digit, and returns both the cleaned text and an exact count of removed characters. That includes ordinary ASCII digits as well as decimal digits used in scripts such as Arabic and fullwidth forms. It is useful for quick cleanup, repeatable preprocessing, and automated workflows where a simple replacement can be easy to apply inconsistently.
What the number remover changes
This capability performs one deliberately narrow transformation: it removes decimal digit characters and preserves everything else in its original order. Letters, spaces, tabs, line breaks, punctuation, emoji, currency symbols, mathematical signs, and surrounding formatting remain untouched. For example, a reference such as “Order 204, aisle 7B” becomes “Order , aisle B”. The result also includes the number of digit characters removed, which makes the change easy to verify in a script or audit log. The definition of a digit is Unicode-aware rather than limited to the ASCII characters 0 through 9. Arabic-Indic, extended Arabic-Indic, Devanagari, and fullwidth decimal digits are treated consistently because each belongs to Unicode’s decimal-number category. Characters that merely resemble numbers but are not decimal digits, such as a Roman numeral letter or a fraction symbol, are preserved. This precise rule avoids language-dependent guesses and ensures that the browser tool and API produce the same answer for the same sequence of characters.
How to use the cleaned text and count
Provide the complete source in the text field and run the capability. The response contains text, holding the transformed value, and removed, holding the exact number of deleted digit characters. A source containing no digits is valid: its text is returned unchanged and removed is zero. A source that contains only digits is also valid: the returned text is an empty string while removed reports the original number of characters. The input itself, however, cannot be empty, because an empty request does not provide material to transform and is reported as invalid input. Whitespace is real text and is therefore accepted and preserved. This distinction matters in automation, where an empty value may signal a missing field while a line of spaces may be intentional formatting. You can use the count as a guard condition, compare it with an expected amount, store it alongside the cleaned value, or display it to a reviewer. No normalization, trimming, case conversion, or punctuation cleanup is performed behind the scenes.
Where digit removal fits in a workflow
Removing digits is helpful when numeric details should not participate in a later text operation. Teams can strip changing sequence numbers from labels before grouping them, remove apartment or room numbers from a set of descriptions, or prepare sample copy that should retain its wording while omitting numeric values. Editors can clean pasted notes without writing a regular expression, and developers can call the API when the same rule must be applied repeatedly. The transformation is deterministic and local: it does not use a language model, make a network request, infer meaning, or store the submitted text. That makes the result predictable, but it also means the tool does not understand context. It will remove digits inside dates, product codes, postal codes, version strings, and words alike. Review the output before using it where those distinctions matter. For structured records, consider selecting the relevant field before calling this capability instead of combining every column into one string. Browser use is available directly, while an API request is priced at $0.002.
What you can do with it
Normalize changing labels
Remove run numbers or sequence digits before comparing labels whose stable wording matters more than their numeric suffixes.
Prepare anonymized sample copy
Delete digit characters from notes or examples while preserving their wording, punctuation, spacing, and line structure for review.
Clean text in an automated pipeline
Apply one documented Unicode-aware rule repeatedly and use the removed count to confirm that the transformation occurred.
FAQ
Which characters are removed?
Every character in Unicode’s decimal-number category is removed, including ASCII, Arabic-Indic, Devanagari, and fullwidth decimal digits.
Are spaces and punctuation preserved?
Yes. Every non-digit character is preserved in its original order, including spaces, tabs, line breaks, punctuation, symbols, and emoji.
What happens when the text has no digits?
The original text is returned unchanged and the removed count is zero.
Can the result be an empty string?
Yes. If the supplied text consists only of digits, all of them are removed and the returned text is empty. The input itself must not be empty.
Does it remove written number words?
No. Words such as one, two, and hundred are letters, so they are preserved. The capability removes digit characters rather than interpreting language.
How much does an API request cost?
Each API request costs $0.002. The same deterministic transformation can also run directly in your browser.
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/remove-numbers \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Invoice 2026-Q3: room ٤٢, batch 12."}'const res = await fetch("https://api.kit.forhosting.com/text/remove-numbers", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Invoice 2026-Q3: room ٤٢, batch 12."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/remove-numbers",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Invoice 2026-Q3: room ٤٢, batch 12."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/remove-numbers", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Invoice 2026-Q3: room ٤٢, batch 12."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Invoice 2026-Q3: room ٤٢, batch 12."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/remove-numbers", 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": "Invoice 2026-Q3: room ٤٢, batch 12."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.remove_numbers",
"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_tokens | 20000 |
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. |