Chinda MT Translation
Translates text between Thai and English, one text or a batch per request, following the rules you set for terms, tone, length and format, and marks any part whose translation may be wrong. The model, ChindaMT-4B, is published at AACL-IJCNLP 2026 with open weights.
- Price1 ICper 400 characters
- MeasuredchrF++ 54.6
- Served1.2Kcalls
Input
- text
- The meeting has been moved to Friday because the boss is busy.
- source_lang
- en
- target_lang
- th
- rules
- Use a casual, friendly tone
OutputPOST /v3/store/text/mt/translate
- translation
- ประชุมย้ายไปวันศุกร์แล้วนะ เพราะเจ้านายยุ่งมาก
- source_lang
- en
- target_lang
- th
- warnings
- []
Without the rule, the same sentence comes back in neutral written Thai: การประชุมถูกเลื่อนไปเป็นวันศุกร์เนื่องจากเจ้านายยุ่ง
Every field, under ResponseOther endpoints: /batch see Request
Request
JSON, with the key in the apikey header. /translate takes one text and /translate/batch several, such as UI strings or table cells; either takes at most 100,000 characters.
Price
1 IC per 400 characters of text, or of all texts, counted exactly as sent and rounded up to the next 400 per request: a 44-character sentence costs 1 IC, a 401-character paragraph 2 IC, a full 100,000-character request 250 IC.
- Spaces, line breaks and lines that come back unchanged all count;
rulesare not billed. - Characters are Unicode code points, so every Thai vowel and tone mark is one character:
ที่is 3. - Only a
200is billed, and it reports the billed characters in theiapp-input-charsheader. Before translating, the gateway checks that your balance covers the whole request and answers402if it does not.
Rules
Rules are short instructions in plain English, applied to the whole text, or to every text in a batch. Chinda MT was trained on five kinds:
| Kind | Example rule |
|---|---|
| Terminology | Translate บาท as THB, Keep product names such as iApp Portal in English |
| Tone and register | Use a formal, polite tone suitable for a business email, Use a casual, friendly tone |
| Length | Use exactly one sentence, Keep it short enough for a subtitle |
| Format | Return only the translation, no quotes, Keep the numbering of the list |
| Language | Avoid English contractions, Write numbers as digits |
A rule works best when it is specific and can be checked in the output. With Keep product names such as iApp Portal, API Keys and Document OCR in English, "press Create Key to start using Document OCR" keeps "Create Key" in English; without it, the button name is translated. Names without a common Thai spelling, such as product names, are kept; a name that has an established Thai spelling is usually written in Thai even with the rule (see Measured). For a long glossary, send the terms that occur in the text, not the whole list.
Response
JSON. A 200 carries the billed characters in the iapp-input-chars header, and every response carries an X-Request-ID header to quote when you report a problem.
Line by line
- Each line is translated on its own. Line breaks, and the spaces at the start and end of each line, are kept.
- A line with no letters of the source language comes back unchanged: a blank line, a line of numbers, or a line already in the target language. It is still billed.
- A batch succeeds or fails as a whole. If it fails, no translations are returned and nothing is billed, so send the whole batch again.
Warnings
A warning marks a part of your text whose translation may be wrong. The request still succeeds, and translation holds the best result for that part.
reason | Meaning |
|---|---|
truncated | The translation was cut off before it finished. |
too_short | The translation is much shorter than its source, so part of it may be missing. |
wrong_language | The translation is not in the target language. |
Details
Measured
On the production service, 28 October 2026, against the public FLORES-200 benchmark (1,012 sentences in each direction) and rule tests built from it; no request failed. chrF++ measures how close a translation is to a professional reference translation, from 0 to 100.
| Measure | Result |
|---|---|
| chrF++, Thai to English, no rules | 54.6 |
| chrF++, English to Thai, no rules | 45.7 |
| Glossary term required by a rule present, English to Thai, 1,802 terms | 94.2% (82.5% without the rule) |
| Glossary term required by a rule present, Thai to English, 1,692 terms | 83.7% (75.3% without the rule) |
| Rule to keep a name in English followed, 533 sentences | 15.4% |
| The same rule in more explicit wording, 150 sentences | 38.0% |
| Median time through the API: one sentence / a batch of 20 | 0.37 s / 0.86 s |
Glossary rules work and did not lower translation quality (English to Thai chrF++ 46.8 with them, 45.8 without). A rule to keep a name in English does not work reliably: the service writes the established Thai spelling of most names. If names must stay in Latin script, use the wording Keep 'Name' in English. Do not translate or transliterate it into Thai. and check the output, or restore the names after translation. Method, rule tests and errors: the benchmark (PDF).
In the accompanying paper, a judge model compared ChindaMT-4B with open translation models of the same size on 200 English-to-Thai and 200 Thai-to-English items per test, corrected for answer length, so 50% is a tie. These are the shares of comparisons in which it preferred ChindaMT-4B:
| ChindaMT-4B compared with | Plain translation | With rules |
|---|---|---|
| Typhoon-Translate-1.5-4B | 61.8% | 68.4% |
| TranslateGemma-4B | 87.2% | |
| MiLMMT-46-4B | 89.5% |
In a blind test of 100 items each, three native Thai speakers preferred ChindaMT-4B over Typhoon-Translate-1.5-4B in 64% of plain translations and 69% of translations with rules. Without rules, quality holds: on the public FLORES-200 benchmark ChindaMT-4B scores 90.7 on the mean of CometKiwi, GEMBA-DA and GEMBA-MQM, the highest of the 4B to 9B models tested, and 87.8 on WMT24++ news, second to a 7B model at 89.4.
Speed through the gateway on 29 September 2026, one request at a time, the median of 3 to 9 runs, network time from Bangkok included:
| Request | Characters | Round trip |
|---|---|---|
| One sentence, Thai to English | 82 | 0.36 s |
| Two sentences, English to Thai | 183 | 0.38 s |
| The same, with two rules | 183 | 0.40 s |
| One paragraph, English to Thai | 653 | 0.60 s |
| About one page, English to Thai | 2,028 | 0.71 s |
| About one page, Thai to English | 2,044 | 0.61 s |
| About five pages, English to Thai | 10,071 | 1.72 s |
Time grows far more slowly than length: five pages take about four times as long as one sentence. For many short strings, one /translate/batch request is faster than many single ones.
Errors
| Status | Cause | What to do |
|---|---|---|
401 | The apikey is missing or not valid. | Check the key on the API Keys page. |
402 | Your balance does not cover the characters in the request. | Top up, or send less text per request. |
413 | text is longer than 100,000 characters, or texts add up to more. | Split the text over several requests. |
422 | The body is invalid: a required field missing, a field the API does not know (such as rule for rules), a language other than th or en, the same language on both sides, rules over 2,000 characters, or an empty texts. | Fix the request. |
429 | The rate limit for this API key is exceeded. | Wait and retry. |
503 | The translation model is unavailable. | Retry later. |
504 | The translation did not finish within 90 seconds. | Retry later, or send less text per request. |
For a 413, 503 or 504, detail is a message; for a 422, it is a list of problems, each with the field's place in loc and the reason in msg. Errors are not billed.
Limits
- Thai and English, in either direction.
- 100,000 characters per request:
text, or all oftextstogether; 2,000 characters ofrulesin total. - 90 seconds per request.
- 5 requests per second, 120 per minute and 3,000 per hour per API key.
- Rules that a good reference translation could satisfy. Strict placeholder tokens and a large mandatory glossary are outside what the model was trained for; check such output before use.
- Like any machine translation, a translation can read fluently and still be wrong. Have legal, medical and other high-stakes text reviewed;
warningsmarks the parts most likely wrong.
Open model
ChindaMT-4B, 2B and 0.8B are open under Apache 2.0 on Hugging Face, with the 1.97 million training records (ChindaMT-Grounded), the evaluation suites (ChindaMT-CoreEval, ChindaMT-BroadEval) and the data curation code (ChindaMT-RGDC). For an on-premise deployment with your own terminology, write to sale@iapp.co.th.
Data handling
Text is translated on iApp-operated servers in Thailand and is not sent to any third party. It is not stored: the logs record the direction and the character count, not the content. Consent and notice under PDPA and GDPR remain with you as the data controller.
Changelog
| Version | Date | Change |
|---|---|---|
| v0.3.1-20261028 | 28 Oct 2026 | source_lang is optional: when it is left out, it is the other language of target_lang. Requests that send it are unchanged. |
| v0.3.0-20260930 | 30 Sep 2026 | A field the API does not know, such as rule for rules, is answered with 422 instead of being ignored, so a misspelt rule is no longer dropped without notice. |
| v0.2.0-20260929 | 29 Sep 2026 | First public release: Thai-English translation in both directions with rules, /translate and /translate/batch, warnings, up to 100,000 characters per request, at 1 IC per 400 characters. |