Change the tone
The same paragraph can sound cold in a support ticket and perfectly fine in a legal disclaimer. The Tone Changer API rewrites text into a chosen register, formal, casual, commercial or empathetic, without touching the underlying facts. It is built for teams that write the same message for very different audiences and cannot afford to sound wrong to any of them.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
The mismatch this fixes
A product description written for a spec sheet reads badly on a landing page, and a support reply drafted like a legal notice frustrates a frustrated customer even more. Tone mismatches are one of the most common and most avoidable writing failures in business content, and fixing them by hand for every channel is exactly the kind of repetitive task worth automating.
The four registers, defined
Formal strips contractions, hedges claims carefully and favors precise vocabulary, the register of contracts and official notices. Casual leans on contractions, shorter sentences and a conversational rhythm suited to chat and social copy. Commercial adds persuasive framing and benefit-forward phrasing without becoming pushy, built for product pages and campaigns. Empathetic foregrounds acknowledgment and warmth before information, the register that de-escalates a tense support conversation or breaks bad news gently.
How the request works
Call POST /text/change-tone with the source text and the target tone; the task is queued and a task_id comes back immediately so your system stays non-blocking. Behind the scenes the engine identifies the current register, then rewrites phrasing, sentence rhythm and word choice to match the target while keeping every fact, number and claim exactly as given. Delivery is a signed webhook call when the task completes, or a signed link valid for 24 hours if you prefer to poll.
Where teams actually plug it in
Support platforms route the same canned answer through the empathetic tone for angry tickets and the formal tone for compliance-sensitive ones. Marketing teams generate a commercial variant of a feature announcement while product docs keep the formal original untouched. Because it runs over a stable, unversioned endpoint, it slots into existing CMS and helpdesk automations without a rewrite of your integration every time the underlying model improves.
Reliability built in, not bolted on
Failed tasks retry automatically up to three times before returning a clear error, and a task that never succeeds is never billed, so batch tone-adjustment jobs can run unattended with predictable costs. There is no free tier and no trial by design: a paid, metered endpoint with balance checks stays fast and free of the spam traffic that plagues open text APIs.
What you can do with it
Support macros in two registers
A helpdesk keeps one canonical answer and generates both an empathetic version for upset customers and a formal one for regulated industries, on demand.
One announcement, two audiences
A SaaS company turns its formal changelog entry into a commercial, benefit-led version for the marketing newsletter without rewriting the facts.
Casual social captions from formal copy
A brand converts press-release language into casual, punchy captions for social channels while keeping the source document as the single source of truth.
De-escalating chat responses
A live-chat tool rewrites a terse internal answer into an empathetic reply before it ever reaches a frustrated customer.
FAQ
What tones can the API produce?
Formal, casual, commercial and empathetic, selected as the target tone in the request to /text/change-tone.
Is the tone changer API free to try?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
How much does changing tone cost?
$0.003 per request plus $0.0135 per 1,000 words, and you are only billed for tasks that complete successfully.
Will it change the facts in my text?
No, the engine changes phrasing and rhythm, not the underlying claims, numbers or facts you submitted.
Can I get results via webhook instead of polling?
Yes, a signed webhook call is the recommended delivery method; a signed link valid for 24 hours is available as an alternative.
Does it support languages other than English?
Yes, the endpoint processes text in the language you submit and preserves that language in the rewritten output.
What happens if my request fails?
It retries automatically up to three times; if it still fails you receive a clear error and are never charged.
Can I batch-process many texts in one tone at once?
Yes, since every call is asynchronous with its own task_id, you can queue as many requests as you need and collect results as they complete.
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, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/change-tone \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"…"}'const res = await fetch("https://api.kit.forhosting.com/text/change-tone", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/change-tone",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/change-tone", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/change-tone", 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": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.change_tone",
"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. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |