Case-insensitive find and replace
Case differences often hide repeated text from an ordinary exact-match replacement.
Run — free
A document may contain Brand, BRAND, brand, and BrAnD even though every form refers to the same thing. This case-insensitive find and replace tool catches every letter-case variant of a literal search term and swaps each match for one replacement. It reports the transformed text and the number of changes, making the result easy to review or automate. The operation is deterministic, uses no network service, and treats punctuation in the search term literally. Run it in the browser for quick edits or call the API for $0.002 per item when the same cleanup belongs in a larger workflow.
Replace every capitalization variant in one operation
Exact find and replace can miss the very variations that make real text inconsistent. A product name might appear in title case at the beginning of a sentence, uppercase in a heading, lowercase in notes, and mixed case after several editors have touched the copy. This capability searches without considering letter case, so one request can find Product, PRODUCT, product, and other case variants of the same literal term. Every non-overlapping match is replaced, from the beginning of the source text through the end. The replacement is inserted exactly as supplied, which lets you standardize all variants to one approved spelling or remove them by using an empty replacement string. Matching is literal rather than regular-expression based. A search containing a period, bracket, plus sign, or question mark looks for that actual character instead of activating special pattern syntax. The response returns both the finished result and a count of substitutions, so you can immediately distinguish a successful cleanup from a request that found nothing. Because the algorithm has no network calls, randomness, or time-dependent behavior, identical inputs always produce identical outputs in the browser, API, tests, and scheduled content pipelines.
Supply clear strings and interpret the result
Provide three fields: text is the source material, search is the literal word or phrase to locate, and replacement is the string that should take its place. All three fields must be strings, although text and replacement may be empty. Search must contain at least one character because an empty search has no useful boundary and could imply a match between every pair of characters. Invalid types and an empty search are rejected as invalid input instead of being silently coerced. The matching rule always ignores letter case; there is no flag to forget and no alternate exact-case mode hidden behind a default. On success, result contains the complete transformed string, count records how many non-overlapping substitutions occurred, and search and replacement echo the values applied. A zero count is still a valid result and leaves the source unchanged. If the search term occurs inside a longer word, it is replaced there too, because this is a literal substring operation rather than a whole-word language parser. For example, searching for cat can also affect Catalog when its letters appear consecutively. Include surrounding spaces or punctuation in search when you need a narrower literal boundary, and inspect count before publishing when a workflow expects a known number of edits.
Use predictable replacement in editing and automation
This tool fits jobs where inconsistent capitalization is the obstacle and the desired substitution is otherwise straightforward. Editors can normalize a brand, department, feature, or person name across pasted copy before it enters a content management system. Support teams can update commands and product labels in response templates even when older contributors used inconsistent case. Developers can clean fixture data, migration inputs, configuration fragments, and generated reports without introducing a regular-expression dependency. For interactive work, paste the source into the browser runner, enter the literal search and replacement strings, then compare the returned count with what you expected. For automated work, submit the same three fields through the API at $0.002 per item and store the result or feed it to the next transformation. Test at least one mixed-case example and one zero-match example when the replacement is part of a critical publishing pipeline. The operation replaces every non-overlapping occurrence and does not preserve the capitalization style of individual matches; every hit receives exactly the same replacement. It also does not understand HTML elements, document structure, grammar, or word boundaries. Choose a structured document editor or a regular-expression tool when those distinctions matter. For literal case-insensitive substitution, the narrow contract keeps behavior transparent and repeatable.
What you can do with it
Standardize brand capitalization
Turn every uppercase, lowercase, title-case, and mixed-case spelling of a brand into one approved replacement.
Refresh support templates
Replace an outdated product label across macros even when different authors capitalized the old label differently.
Clean migration data
Normalize literal status names, codes, or tags before importing text into a new system.
FAQ
Does this replace every capitalization of my search term?
Yes. It ignores letter case and replaces every non-overlapping literal match with the exact replacement you provide.
Can the search term contain regular-expression characters?
Yes. Characters such as periods, brackets, plus signs, and question marks are treated literally, not as pattern syntax.
Can I delete all matches?
Yes. Send an empty replacement string. The search string must still contain at least one character.
What happens when there are no matches?
The request succeeds with the original text unchanged and a count of zero.
How much does API use cost?
Each API item costs $0.002. The browser runner is available for quick local use without an API call.
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/replace-ci \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Draft, DRAFT, and draft all mean the same thing.","search":"draft","replacement":"final"}'const res = await fetch("https://api.kit.forhosting.com/str/replace-ci", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Draft, DRAFT, and draft all mean the same thing.",
"search": "draft",
"replacement": "final"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/replace-ci",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Draft, DRAFT, and draft all mean the same thing.",
"search": "draft",
"replacement": "final"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/replace-ci", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Draft, DRAFT, and draft all mean the same thing.","search":"draft","replacement":"final"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Draft, DRAFT, and draft all mean the same thing.","search":"draft","replacement":"final"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/replace-ci", 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": "Draft, DRAFT, and draft all mean the same thing.",
"search": "draft",
"replacement": "final"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.replace_ci",
"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. |