Translate text
A product description, a support reply, or a set of terms and conditions is only useful to the people who can read it in their own language. This endpoint translates text across more than 100 languages behind a single, unversioned call, so localization stops being a separate project and becomes a step in the pipeline.
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.
Translation as infrastructure, not a project
For most of its history, translating a product or a site meant hiring translators, managing a glossary, and shipping a new language as its own multi-week effort. That model still makes sense for a flagship marketing page, but it breaks down completely for user-generated content, support tickets, or a catalog that changes daily. translate.text is built for that second category: text that needs to move between languages continuously, not once.
How a single call becomes a translated string
POST /translate/text with the source text and target language, get a task_id back right away, and receive the translation by webhook or a signed link valid for 24 hours once it's ready. The same endpoint covers more than 100 languages, so a single integration handles a French storefront, a Korean support inbox and an Arabic terms page without separate vendors or separate code paths.
What machine translation is honestly good at
Machine translation has improved enormously since the field moved from rule-based systems to neural models trained on huge volumes of bilingual text, and for clear, well-structured source text it now produces fluent, usable translations reliably. It's still translation, not adaptation: idioms, brand voice, legal nuance and cultural context can need a human pass afterward, especially for anything customer-facing at scale like a tagline or a legal disclaimer.
Where the source text matters as much as the model
Clean, unambiguous source text translates more faithfully than text full of internal jargon, broken sentences, or heavy slang, since the system has to resolve the same ambiguity a human translator would, without the chance to ask what was meant. Short, well-formed strings — a UI label, a product title, a paragraph of support copy — are the sweet spot; a long document with inconsistent formatting is better split into logical chunks before it's sent through.
How teams automate localization with it
E-commerce platforms translate new product listings the moment they're added, so a catalog launches in a dozen markets without a translation queue. Support teams translate incoming tickets and outgoing replies in real time so an agent can work in one language regardless of the customer's. Because it's billed per request plus per 1000 words and runs asynchronously, translating a single sentence or a full catalog update uses the exact same integration.
What you can do with it
Product catalog localization
An online store translates every new product listing on creation, so items become available in a dozen markets without a manual translation queue.
Real-time support translation
A helpdesk translates incoming customer messages and outgoing agent replies so a single support team can serve multiple languages.
User-generated content at scale
A marketplace translates buyer and seller messages automatically, letting people transact across languages without a shared one.
Legal and policy documents
A company translates its terms of service into every language its product ships in, then routes the drafts to legal review before publishing.
FAQ
How do I translate text with the API?
Send the text and target language to POST /translate/text, store the returned task_id, and get the translation by webhook or a signed link valid for 24 hours.
Is the translation API free?
No, there's no free tier or trial. It costs $0.003 per request plus $0.0135 per 1000 words, and a failed job is never charged.
How many languages are supported?
More than 100 languages through the same single endpoint, without switching providers or code paths per language pair.
Is machine translation accurate enough for a website?
For clear, well-structured source text it produces fluent, usable translations reliably; customer-facing copy like taglines or legal text often benefits from a human review pass afterward.
Can it translate large volumes of text?
Yes, pricing scales per 1000 words on top of the base request fee, so it fits everything from a single string to a full catalog update.
How is this different from a translation plugin?
This is a direct API endpoint with a published price and no rendering layer, meant to be called from your own backend or pipeline rather than embedded as a widget.
Can I submit many translation requests at once?
Yes, submit each piece of text as its own async task and collect results by webhook as they complete, which scales cleanly for bulk jobs.
Is my text kept after translation?
No, source text and translations are deleted after the retention window and are never used to train any model.
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/translate/text \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello world","target_lang":"es"}'const res = await fetch("https://api.kit.forhosting.com/translate/text", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello world",
"target_lang": "es"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/translate/text",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello world",
"target_lang": "es"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/translate/text", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello world","target_lang":"es"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello world","target_lang":"es"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/translate/text", 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",
"target_lang": "es"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "translate.text",
"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. |