16 October 2026 · Language & Localization APIs · 6 min read
I run this site and its sister project in seven languages. Right now that's 7,206 live translated HTML files on disk between the two of them -- not a one-time push, an ongoing pipeline that translates new pages as they're written. I've never paid a cent for a translation API to do it. Then one night in August the free route I built it on got my server's IP banned by Google for 19 hours, and I had to sit down and actually price what the honest version of this would cost.
Both sites use deep_translator's GoogleTranslator class, which doesn't call the paid, keyed Google Cloud Translation API -- it scrapes translate.googleapis.com, the same endpoint the free translate.google.com web page uses. No API key, no quota dashboard, no SLA. It's free because Google never agreed to sell it to you at that price; you're just using the consumer page's backend directly.
That worked fine for months. Then on 24 August at 19:56, every call started throwing TranslationNotFound. I ran a direct curl against the same endpoint and got back an HTTP 429: "Sorry... your computer or network may be sending automated queries." Not a Google outage -- an anti-bot block on our specific IP, almost certainly earned by our own volume (hourly batch jobs translating hundreds of pages across 29 language slots we support internally, 7 of which are live). It took roughly 19 hours to clear.
Here's the part that actually worried me once I found it. The function that wraps the translator call was written to retry three times, then give up and return the original English string -- while the caller still logged the page as successfully translated. That means for 19 hours, any new page built during the block would have silently shipped English text inside a German or Japanese page, with zero error signal anywhere. An outage you can see is an inconvenience. An outage that reports success while lying about the output is the one that actually damages a multilingual site's credibility, and it would have kept doing that indefinitely if I hadn't gone looking.
The fix was adding MyMemoryTranslator -- also free, also from deep_translator -- as a fallback inside the same function. When Google's scraper exhausts its retries, MyMemory gets tried before giving up. It needs locale-formatted codes (de-DE, not de), which is an easy thing to miss and silently get zero results on if you don't map it per language.
I measured our actual live footprint to answer that properly, rather than guessing: 7,206 translated pages across the two sites' seven live languages (Spanish, German, French, Portuguese, Russian, Japanese, Italian), stripped of markup, comes to roughly 39 million characters of real visible text. Priced at each vendor's current published per-character rate for a one-time pass over that exact snapshot:
| Provider | Rate | Cost for our 39M chars |
|---|---|---|
| Azure Translator | $10 / million chars | ≈ $390 |
| Amazon Translate | $15 / million chars | ≈ $585 |
| Google Cloud Translation (paid, official) | $20 / million chars | ≈ $780 |
| DeepL API, Growth plan | $27.50/million + $26/mo base | ≈ $1,073+ |
None of those numbers are large for a company. They're also not nothing for a side project, and more importantly they'd recur every time the site adds enough new content to need another translation pass -- which, since we publish daily, is closer to a monthly bill than a one-off. At our actual publishing rate that's realistically $50-150/month depending on vendor, forever, for something the free scraper does at $0 as long as it stays under whatever volume trips the IP block.
I want to be specific about where the free route actually ends, because "just use the free fallback" isn't a real substitute for a paid API at our scale. MyMemory's anonymous free tier caps out around 5,000 words a day. That's enough to absorb an occasional Google block without anyone noticing. It is nowhere close to enough to translate 7,200+ pages as a primary method -- it would take weeks to get through a backlog that size, assuming the quota resets reliably. It only works in our pipeline because it catches a rare failure window, not because it's a real alternative to GoogleTranslator, let alone to a paid vendor.
While I was in there fixing the outage, a routine audit turned up a translation quality bug that had nothing to do with the 429 block: our German UI's "Share:" label had been translated as "Aktie:" -- which means stock or equity share, not share-this-link -- across 326 pages from an older batch. Italian had the infinitive "Condividere:" instead of the correct imperative "Condividi:" on 330 pages; Russian had the same infinitive/imperative mix-up on 324; French was missing a required space before the colon on 325. All four are the kind of mistake a native speaker catches in two seconds and a generic MT engine, free or paid, just doesn't reliably avoid on short UI strings. I hand-fixed all four directly rather than re-running any translator on them -- for short, high-visibility microcopy like a Share button label, writing the correct phrase once in each language is faster and more reliable than trusting any engine, including the paid ones I priced above.
I'm keeping the free scraper-plus-fallback setup. At $0 against a realistic $50-150/month, the math still favors it, and the visible-failure fix means a future block degrades to "slower" instead of "silently wrong." But I'm treating the 19-hour block as a warning shot, not a one-off: if it starts recurring weekly instead of once every couple of months, the honest move is paying for Azure Translator at roughly $390 for our current backlog and a small monthly trickle after that, not finding a third free workaround. Free infrastructure that depends on an unofficial endpoint not noticing you is a cost you're deferring, not one you've eliminated -- and the day it stops working for good is not a day you want to be choosing a vendor under pressure.
New to usage-based API pricing in general? Start with the free API-cost guides.
Deploy it yourself: DigitalOcean — $200 free credit ↗ · Hostinger VPS ↗
Page/character counts measured directly against our own live file tree, 2026-10-16. Vendor rates sourced from each provider's own current pricing page (Azure, Amazon, Google Cloud, DeepL), reference figures not live quotes -- confirm current terms directly with each provider before budgeting.