To translate user-generated content without losing your terminology, send it through Crowdin’s AI translation API with the translation memories (TMs), glossaries and style guides you already maintain. There are two calls – AI Translate Strings for text and AI File Translations for files – and neither needs a Crowdin project.
Reviews, comments, listings and support messages are content no one would ever send to a translator. There’s too much of it, and it has to appear in minutes. So it usually goes straight to a machine translation engine that has never seen your glossary.
This guide shows how to translate it with the same data your localization team already uses for your product.
What counts as user-generated content?
User-generated content is any text that people outside your company create on your website or in your product – your users, customers or the businesses that sell through your platform. For example:
- reviews
- comments and forum posts
- support tickets and chat messages
- property listings that hosts publish on a rental platform
- product listings that sellers publish on a marketplace
- menus that restaurants upload to a food delivery app
Your team doesn’t write any of it, but your users still expect to read it in their language.
All user-generated content shares the same traits:
- It never stops. New content arrives every minute, not in releases.
- Any author, any language. You often don’t know the source language until the text arrives.
- It has to appear fast. Nobody waits a day for a translated review.
- There’s too much of it to send to translators.
How do teams usually translate user-generated content – and what gets lost?
Most teams either push user content through a project in their TMS or call a machine translation engine or LLM directly. The first can be too slow for content that never stops. The second leaves your TM, glossary and style guide behind.
| Approach | How it works | Uses your TM, glossary and style guide | What you maintain |
|---|---|---|---|
| Crowdin project + pre-translation | Upload the content, run pre-translation, download the result | Yes | The upload and download for every new piece of content |
| Direct call to an MT engine or LLM | Send text to DeepL, Google or an LLM | No, unless you copy them over | A second copy of your terminology and rules, kept in sync |
| Crowdin AI translation API | One API call with the IDs of your TMs, glossaries and style guides | Yes | No second copy of your TM, glossary or style guide – they stay in Crowdin |
Projects are still the right place for content you own: UI, marketing pages, help center. The API covers everything else.
How does the Crowdin AI translation API work?
Crowdin’s API has two calls for this: AI Translate Strings for text and AI File Translations for files. Both accept the same context, and neither needs a project.
| AI Translate Strings | AI File Translations | |
|---|---|---|
| Endpoint | POST /ai/translate | POST /ai/file-translations |
| How it runs | Synchronous – translations come back in the same response | Asynchronous – start a job, check its status, download the result |
| What you send | Up to 500 strings, up to 10,000 characters each | A file uploaded to Crowdin storage |
| What you get back | The translations and the source language | The file in its original format, or source–target pairs as JSON |
| Best for | Reviews, comments, listings, chat messages | Files from partners and suppliers |
In every request, you can pass:
- TMs, glossaries and style guides – by their IDs in Crowdin
- AI instructions or an AI model – either your saved AI instructions from Crowdin’s AI settings, or a provider and model chosen for this request
- Instructions for this request – what only your app knows, like where the text will appear
- Images – up to 10 per request, as visual context The source language is optional. If you leave it out, Crowdin detects it and returns it in the response.
Sebastian Dzięcielski, a localization consultant, tested both calls on Crowdin Enterprise. Here’s his short demo:
For a step-by-step tutorial with Python code, see his guide.
Put your TM, glossaries and style guides to work on user content
How do you prepare your style guide and glossary for user-generated content?
Use the glossaries and style guides you already have in Crowdin, and add a few rules for user content. Your localization team keeps them up to date in Crowdin, with no changes to your app’s code.
Glossary. Make sure your glossary covers the terms that appear in both your product and user content: brand names, product and plan names, category names. If your app has a membership program called “Forkful Plus”, every review that mentions it should keep that name.
Style guide. User content needs different rules than your UI. A starting point you can copy into a Crowdin style guide:
User-generated content (reviews, comments, listings, support messages)
- Keep the author's tone: a casual review stays casual.- Translate what the author wrote. Don't add, remove or correct information.- Keep emojis, prices, numbers and order numbers as they are.- Don't translate usernames, URLs, email addresses or hashtags.- Keep brand and product names exactly as in the glossary.- [Language]: use formal / informal address.Two style guide settings to check:
- Style guides are switched on. In Crowdin’s AI settings, make sure style guides are enabled for the AI instructions you use. In Sebastian’s test, the style guide in his request had no effect until he switched them on.
- The AI-ready version is up to date. The AI reads a short summary of your style guide, not the full text. After you edit the style guide, update its AI-ready version – for example, click Generate to summarize it again. Until then, the AI keeps following the old rules.
One change, every next request. Say your Polish translations are informal, and you decide to switch to formal. The localization manager changes one line in the style guide, updates its AI-ready version, and the same request comes back different:
| Style guide says | Translation |
|---|---|
| Informal | Dodaj ulubione dania do koszyka i wybierz odbiór osobisty lub dostawę. |
| Formal | Prosimy dodać ulubione dania do koszyka i wybrać odbiór osobisty lub dostawę. |
Nobody had to deploy anything or open a ticket.
What instructions should you add for each content type?
Your style guide covers rules that always apply. Instructions for each request carry what only your app knows at that moment: where the text will appear, what to keep, how long it can be. You pass them in the instructions field, and images in attachmentIds.
| Content type | Instruction example | Extra context |
|---|---|---|
| Menus that restaurants upload to a delivery app | ”Restaurant menu shown on a mobile card. Keep traditional Italian dish names in Italian; translate only the description.” | A photo of the menu card |
| Listings shown on cards | ”Keep each text under 300 characters: card limit.” | – |
| Reviews and comments | ”User review. Keep the reviewer’s tone.” | – |
| Support tickets and chat | ”Support message. Keep order numbers and error codes unchanged.” | – |
| Files from partners | ”Content supplied by a partner restaurant, published in our app.” | – |
What one instruction changes. An Italian menu translated into Polish without the dish-name instruction:
Bruschetta z pomidorami – opiekany chleb z pomidorkami, bazylią i oliwą z oliwek extra vergine.
With it, the dish name stays in Italian and only the description is translated:
Bruschetta al pomodoro – opieczony chleb z pomidorkami, bazylią i oliwą z pierwszego tłoczenia.
What an image adds. In Sebastian’s test, the instructions asked the AI to add a short description of the dish, using only information given in the request. With just the name “Zuppa forte”, it could only offer a literal “mocna zupa” (“strong soup”). With a photo of the menu card attached, it read the description printed on the card and explained that it’s a traditional Neapolitan dish of slow-cooked pork offal with chili.
When should the translation happen?
You can translate content as soon as it’s added, or only when someone asks to read it in another language. Files from partners go through a separate call.
| When | How it works | Example | API call |
|---|---|---|---|
| As soon as content is added | The text is translated into all your languages right after it’s saved | A host publishes a listing, and it’s ready in every language before the first visitor arrives | AI Translate Strings |
| When someone asks | The text is translated only when a reader clicks “See translation” | A review stays in Polish until a reader asks to see it in English | AI Translate Strings |
| When a file arrives | The whole file is translated and comes back in the same format | A restaurant sends its menu as a Markdown or Excel file | AI File Translations |
Crowdin doesn’t store these translations, so save the results on your side and reuse them instead of translating the same text again.
How does your localization team stay in control?
Everything that shapes the translation lives in Crowdin, not in your codebase. Your localization team controls how user content is translated the same way it controls the product.
| What shapes the translation | Where it lives | Who changes it |
|---|---|---|
| TMs, glossaries, style guides | Crowdin | Localization team |
| AI instructions | Crowdin AI settings | Localization team |
| AI provider and model | Crowdin AI settings, chosen per request | Localization team and developers |
| Instructions for each request | Your app’s code | Developers, with input from the localization team |
Fix a term or a rule once in Crowdin, and every next request uses it – for style guides, after you update the AI-ready version. To see what happened with a specific request, check the AI request logs via the API (GET /ai/request-logs).
What should you check before going to production?
Test the setup on your own content and volumes first. These are the points to check:
- Speed. These are AI calls, so they aren’t instant. Measure how long they take for your content and languages.
- Response validation. Check every response for empty translations. For files, check the validation report before you publish the result.
- Limits. 500 strings per call, 10,000 characters per string, 10 images per request and 20 concurrent API requests per account.
- Storage. Translations aren’t saved in Crowdin, so store them on your side.
- Endpoints. On Crowdin Enterprise, the calls are on your organization’s domain:
https://{your-org}.api.crowdin.com/api/v2/ai/.... On crowdin.com, they’re under your user:https://api.crowdin.com/api/v2/users/{userId}/ai/....
What to hand your developer:
- a Crowdin personal access token
- the IDs of the TMs, glossaries, style guides and AI instructions to use
- Sebastian’s tutorial with Python code
- the API reference for Crowdin Enterprise or crowdin.com
- the plain-text API spec for coding agents: Crowdin Enterprise, crowdin.com
Conclusion
The hardest part of good translation is already done: your team has spent years building the TM, the glossary and the style guide.
With Crowdin’s AI translation API, that data works for every piece of text your users write, not only for your product. Your localization team keeps it in one place and stays in control of how all of it sounds.
Localize your product with Crowdin
FAQ
Do I need a Crowdin project to translate content via the API?
No. You send the text or file with the IDs of your TMs, glossaries and style guides, and get the translation back. No project is created.
Which AI provider translates the text?
The one you connect in Crowdin’s AI settings, for example OpenAI, Anthropic or Google Gemini. You can choose the provider and model for each request.
What if I don’t know the source language?
Leave the source language out. Crowdin detects it and returns it in the response.
Are the translations stored in Crowdin?
They aren’t saved to a Crowdin project. If you want to keep them, store them on your side.
Can I add images as context?
Yes, up to 10 images per request. Upload them to Crowdin storage first, then pass their IDs.
Which file formats can I translate?
- Documents: DOCX, PPTX, MD, ODT, HTML, TXT, IDML, MIF, DITA
- Spreadsheets and data: CSV, XLSX, JSON, XML, YAML, XLIFF
- Subtitles: SRT, VTT, SBV
- Localization formats: Android, macOS strings, Properties, Gettext, RESX, ARB, i18next JSON
Does it work on both crowdin.com and Crowdin Enterprise?
Yes. The endpoints differ: on Crowdin Enterprise they’re on your organization’s domain, and on crowdin.com they’re under your user.
What are the limits?
Up to 500 strings per call, 10,000 characters per string, 10 images per request and 20 concurrent API requests per account.
Yuliia Makarenko
Yuliia Makarenko is a marketing specialist with over a decade of experience, and she’s all about creating content that readers will love. She’s a pro at using her skills in SEO, research, and data analysis to write useful content. When she’s not diving into content creation, you can find her reading a good thriller, practicing some yoga, or simply enjoying playtime with her little one.