Machine translation API

Translation API for Europe

One HTTP call, 36 languages, billed per character. Built in Europe for teams that need translation inside their product, not another web app.

Create free account Read the docs

Try it now

0 of 300 characters

The translation appears here.

No account needed

01

Priced per character

No seats, no minimum spend, no annual commitment. Prepaid credit or a plan with included volume — you can switch at any time.

02

Your text is not our product

We never store the text you send in usage records. The translation cache can be switched off per team, and every processor is listed in the data processing agreement.

03

Drop-in for DeepL clients

Same parameters, same response shape, same auth header. Point your client at api.vizvuz.com, swap the key, and keep the rest of your code.

Five lines to your first translation

Send an array of up to 50 strings and a target language. Everything else is optional.

curl

curl -X POST https://api.vizvuz.com/v1/translate \
  -H "Authorization: Bearer vz_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"text":["Hello world"],"target_lang":"DE"}'

PHP

$ch = curl_init('https://api.vizvuz.com/v1/translate');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer vz_live_xxxxxxxx', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['text' => ['Hello world'], 'target_lang' => 'DE']),
]);
$response = json_decode(curl_exec($ch), true);
echo $response['translations'][0]['text'];

JavaScript

const response = await fetch('https://api.vizvuz.com/v1/translate', {
  method: 'POST',
  headers: { Authorization: 'Bearer vz_live_xxxxxxxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({ text: ['Hello world'], target_lang: 'DE' }),
});
const { translations } = await response.json();
console.log(translations[0].text);

Python

import requests

response = requests.post(
    "https://api.vizvuz.com/v1/translate",
    headers={"Authorization": "Bearer vz_live_xxxxxxxx"},
    json={"text": ["Hello world"], "target_lang": "DE"},
    timeout=30,
)
print(response.json()["translations"][0]["text"])

Go

body, _ := json.Marshal(map[string]any{
    "text":        []string{"Hello world"},
    "target_lang": "DE",
})
req, _ := http.NewRequest("POST", "https://api.vizvuz.com/v1/translate", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer vz_live_xxxxxxxx")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)

Simple, published prices

Pay as you go costs €15.00 per million characters. Starter is €19.00 per month with 2,000,000 characters included. Business is €99.00 per month.

See all prices

Frequently asked

How good is the output?

It is produced by a large language model with a translation-specific prompt, glossary enforcement and formality control. For European language pairs it is competitive with the established providers; test it with your own text before you commit — the demo above needs no account.

Where is my data processed?

The application, database and queue run in Germany. The translation engine provider may process the text in the EU or the US depending on configuration; the current setup is named in the data processing agreement, and transfers rely on the EU standard contractual clauses.

Can it keep my HTML intact?

Yes. Set tag_handling to html or xml and tags are preserved, attributes are left alone and only text nodes are translated. Document files such as DOCX and PDF are on the roadmap, not in the current release.

How much work is switching?

For most projects: two lines. Change the base URL to https://api.vizvuz.com/v1 and the key. The DeepL-Auth-Key header is accepted as well, so official DeepL client libraries usually work unmodified.

What are the request limits?

Up to 50 texts per request, up to 50,000 to 200,000 characters per request depending on plan, and 10 to 100 requests per second. Every response carries the current rate-limit headers.