All posts

Why DeepL's API Pricing Doesn't Scale

An analysis of DeepL API pricing at scale, its hard limits, missing features, and when it makes sense to look at alternatives.

DeepL makes excellent translations. For European languages, it's probably the best NMT engine available. But "best quality" and "best choice for my product" aren't the same thing. Here's where DeepL's API starts to crack.

The Pricing Cliff

DeepL API Pro costs $25 per million characters. That's 25% more than Google Translate ($20/1M) and 67% more than Amazon Translate ($15/1M).

At low volume, this premium is barely noticeable. Translating 2 million characters per month? That's a $50 bill from DeepL vs $40 from Google. Not worth thinking about.

At scale, it's a different story:

| Monthly volume | DeepL | Google | Amazon | Difference (DeepL vs cheapest) | | -------------- | ------- | ------- | ------ | ------------------------------ | | 5M chars | $125 | $100 | $75 | +$50 | | 20M chars | $500 | $400 | $300 | +$200 | | 100M chars | $2,500 | $2,000 | $1,500 | +$1,000 | | 500M chars | $12,500 | $10,000 | $7,500 | +$5,000 |

At 500M characters per month (a realistic volume for a content platform with multiple languages), you're paying $5,000/month more than Amazon Translate for translation quality that, frankly, most users won't notice on the majority of strings.

The Free Tier Is a Dead End

DeepL's free tier gives you 500,000 characters per month. Sounds fair. But there are strings attached:

  • The free tier uses a different API endpoint (api-free.deepl.com vs api.deepl.com)
  • It has stricter rate limits
  • It has lower priority — requests can be slower during peak times
  • You cannot upgrade from Free to Pro seamlessly. You get a different API key. If you hardcoded the free endpoint anywhere, you're rewriting it.
This means you can't smoothly transition from prototype to production. You'll need to swap endpoints and keys, which is a deploy, not a config change, if you've baked the base URL into your code.
// Don't do this
const DEEPL_URL = "https://api-free.deepl.com/v2/translate";

// Do this instead const DEEPL_URL = process.env.DEEPL_API_URL; // swap via env var

Missing Features That Matter

No built-in caching

DeepL doesn't cache your translations. Translate "Save changes" to German today, translate it again tomorrow, and you pay for both requests. If your CI/CD pipeline runs translations on every deploy, you're paying for identical work repeatedly.

You'll build a caching layer. Everyone does. But that's engineering time and infrastructure you're maintaining.

No context parameter

DeepL translates text in isolation. You can set formality (formal/informal) for some languages, which is nice. But you can't tell it "this is a button label" or "this is an error message" or "this string appears after the user's name."

Context changes translation. "Close" as a button label should translate differently than "close" as an adjective. DeepL has no way to know which one you mean unless you happen to provide enough surrounding text.

No BYOK (Bring Your Own Key)

If you want to use your own LLM API key (say, an OpenAI key through a translation API), DeepL doesn't support that model. You're locked into their NMT engine. Services like auto18n let you bring your own API keys, so you control the underlying model and costs.

Limited batch translation

DeepL supports sending multiple texts in one request, but there's a request size limit of 128KB. For large-scale batch jobs — translating a database of 100K strings — you need to chunk requests yourself and handle rate limiting.

The Rate Limit Problem

DeepL doesn't publish specific rate limits for Pro accounts. Their documentation says "reasonable usage" and warns against "excessive requests." In practice, I've seen throttling kick in around 50-80 requests per second.

For bulk translation, this matters. If you need to translate 100,000 strings:

  • At 50 requests/second with 1 string per request: ~33 minutes
  • At 50 requests/second with 50 strings per request: ~40 seconds
Batching helps, but the 128KB request size limit caps how much you can batch. And if you get throttled, DeepL returns a 429 with a Retry-After header that can be 1-60 seconds. Your bulk job just stalled.

Google Cloud Translation has explicit quotas (600K chars/minute default, requestable increases) which are easier to plan around. You know exactly what you're getting.

Where DeepL Still Wins

I don't want to be unfair. DeepL has genuine strengths:

Translation quality for European languages. If your product's main markets are Germany, France, Spain, Netherlands, or Poland, DeepL produces the most natural translations of any NMT service. Period.

Formality control. The formality parameter (available for German, Dutch, Polish, Portuguese, and a few others) lets you switch between formal and informal register. This is actually useful for product copy.

import deepl

translator = deepl.Translator("YOUR_KEY")

# Informal (du/ihr) result = translator.translate_text( "How are you?", target_lang="DE", formality="less" ) print(result.text) # "Wie geht's dir?"

# Formal (Sie) result = translator.translate_text( "How are you?", target_lang="DE", formality="more" ) print(result.text) # "Wie geht es Ihnen?"

Document translation. DeepL can translate entire documents (PDF, DOCX, PPTX) and preserve formatting. The quality is good and the workflow is simpler than Google's Document AI pipeline.

Simple auth. An API key in a header. No cloud provider setup, no IAM roles, no service accounts.

When to Look for an Alternative

You should consider replacing DeepL when:

  • Your monthly translation volume exceeds 50M characters and cost matters
  • You need more than 33 languages
  • You're re-translating the same content repeatedly and need built-in caching
  • You need context-aware translation (product copy, UI strings that change meaning based on usage)
  • You want to use your own LLM API keys for translation
The alternatives worth considering:

Google Translate — if you need more languages and lower per-character cost, and can tolerate the GCP setup.

Amazon Translate — if cost is the primary driver and you're on AWS.

auto18n — if you want LLM-quality translation with context, automatic caching, and a simpler developer experience. The caching alone can bring your effective per-character cost well below DeepL's rate.

Self-hosted LLM translation — if you have the infrastructure and want full control. Running an open-source model like NLLB-200 gives you unlimited translations at the cost of GPU compute.

The Bottom Line

DeepL is a premium product at a premium price. The quality premium is real for European languages, but it's not a premium that scales well. At 100M+ characters per month, you're paying $500+/month more than alternatives for a quality difference that's measurable but rarely business-critical.

If you're early stage and your main markets are European, start with DeepL. The quality will make your product feel more polished. But plan your architecture to be API-agnostic — use an abstraction layer so you can swap providers without touching business logic. You'll thank yourself later.