Translation infrastructure for the agent era.
Most translation APIs were designed when "translation" meant a human pasted text into a web form. FluentC was designed for what translation is now: an agent calling an API thousands of times an hour, in the middle of a workflow, expecting an answer back before the user notices.
That shift changes everything underneath the API — how caching works, how batches are handled, how pricing is structured, how rate limits behave. We rebuilt the stack around it.
One product. A few moving parts. Here's the tour.
Each section links to a deeper page if you want the full story.
One endpoint, three input formats, one UUID for auth.
POST /ai_agent/translate handles text, HTML, and JSON. You pick the input format, the target language, and whether you want the answer back synchronously or as a batch job. That's the whole surface area.
Authentication is a single UUID in the Authorization header. No token exchange, no client libraries required to get going. curl works. n8n works. A LangChain tool works. Whatever you're holding works.
curl -X POST https://api.fluentc.io/ai_agent/translate \ -H "Authorization: 4f3a-uuid-...-9c2e" \ -H "Content-Type: application/json" \ -d '{ "input_format": "json", "target_language": "es", "mode": "sync", "content": { "title": "Hello", "body": "Welcome" } }' # 204ms · 200 OK { "translation": { "title": "Hola", "body": "Bienvenido" }, "target_language": "es", "tm_hit": false, "request_id": "tx_8f3a72c4" }
For when an agent is mid-conversation and needs the answer now.
Synchronous request, translated text in the response, no polling.
Behind the scenes there's a content-addressed cache keyed on SHA256(target_language + input). The second time the same string comes through, you skip the model entirely — same translation, same key, faster response.
This matters more than it sounds like it should. A multilingual chatbot answering "hello" in twelve languages will hit that cache constantly.
For when you've got 50,000 rows and you need them all in one go.
Submit the job, get a job_id back, poll for results when you're ready. Works for a Google Sheet, a product catalog, a directory of JSON i18n files — anything.
JSON is handled properly: nested structures are walked, every string value gets translated independently and in parallel, and the original shape is reassembled at the end. Keys stay keys. Structure stays structure.
The same job_id is safe to poll forever — it's a deterministic hash of your input, not a random ticket. Re-submit the same content and you get the same job_id back and the same cached result.
Pay once for "Add to cart." Forever.
Translation memory is a database of translations you've already paid for. The next time the same string comes through, you don't pay again — and the response is faster because it doesn't hit the model.
Most translation APIs charge you per character every time. We don't. For ecommerce catalogs, support macros, and any product with repeating strings, this is where most of the savings come from.
You can also overwrite specific translations on a per-site basis when you want a different rendering than the model's default. The cache respects your overrides.
The catalog you'd expect, scoped to whichever agent is asking.
The major European languages, the major Asian languages, Arabic, Hebrew, Hindi, and the long tail beyond that.
The list is cached and exposed at GET /ai_agent/languages, scoped to whatever you've enabled on your agent.
Add or remove languages from your dashboard. Each agent has its own enabled set — so a Shopify agent translating into ten languages and an internal support agent translating into three can live under the same account.
Five things worth knowing if you're evaluating.
Identical input + target language is a cache hit. No "fuzzy match" surprises, no per-call billing on repeat strings.
Re-submitting the same batch input returns the same job_id. Idempotent by design.
Background translation jobs retry on model timeouts (5 attempts, exponential backoff) and rate limits (10 attempts, respecting Retry-After). You don't have to build this yourself.
A document with 200 string values doesn't run 200 sequential model calls — it fans out and reassembles.
The whole API is reachable from curl. SDKs exist if you want them; they're not a prerequisite.
The OpenAPI spec is published at /ai_agent/swagger.yml and the interactive docs at /ai_agent/docs.