Skip to main content

ChindaMT Translation API

ChindaMT translates between Thai and English and follows the rules you send with the text: which term to use, which tone to write in, how long the result may be and what format it must keep. A translation can be correct in every word and still be wrong for the job. A subtitle needs the character's voice, a contract needs fixed terms, a group chat needs casual Thai, a brand needs its own style. ChindaMT is trained to follow such instructions without losing translation quality. The research behind it is published at AACL-IJCNLP 2026 (Main Conference), and the model weights are open under Apache 2.0. This API serves ChindaMT-4B.

Live Demo​

Pick an example or type your own text, add rules if you want, and press Translate. With "compare" ticked, the demo also translates the same text without your rules so you can see what they changed. Each translation is charged at 1 IC per 400 characters.

62 characters · 1 IC
Pick an example or type your own text, add rules if you want, then press Translate.
Request as cURL
curl -X POST 'https://api.iapp.co.th/v3/store/text/mt/translate' \
  -H 'apikey: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"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"]}'

Quick Start​

You need an API key from the iApp AI Portal. Send the text as JSON with the apikey header:

curl -X POST https://api.iapp.co.th/v3/store/text/mt/translate \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"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"]
}'
{
"translation": "ประชุมย้ายไปวันศุกร์แล้วนะ เพราะเจ้านายยุ่งมาก",
"source_lang": "en",
"target_lang": "th",
"warnings": []
}

Without the rule, the same sentence comes back in neutral written Thai: "การประชุมถูกเลื่อนไปเป็นวันศุกร์เนื่องจากเจ้านายยุ่ง". Code examples for Python and JavaScript are in the Technical Reference.

Endpoints and Pricing​

EndpointDescriptionPrice
POST /v3/store/text/mt/translateTranslate one text, up to 100,000 characters1 IC per 400 characters
POST /v3/store/text/mt/translate/batchTranslate a list of separate texts (UI strings, table cells) in one request, up to 100,000 characters in total1 IC per 400 characters

Billing counts the characters of text, or of all texts, exactly as you sent them, rounded up to the next 400 per request:

  • Everything in the text counts: spaces, line breaks, and lines that come back unchanged.
  • Rules are not charged.
  • Characters are Unicode code points, so every Thai vowel and tone mark is one character: ที่ is 3 characters.
  • Only a successful 200 response is charged. Rejected and failed requests are free.

A 44-character sentence costs 1 IC, a 401-character paragraph 2 IC, and a full 100,000-character request 250 IC. The number of characters charged is returned in the iapp-input-chars response header. Before a request is processed, the gateway checks that your balance covers its full cost; if not, it returns 402 without translating.

Rules​

Rules are short instructions in plain English, sent as a list of strings in rules. They apply to the whole text (or to every text in a batch), up to 2,000 characters in total. ChindaMT was trained on five kinds of rule:

KindExample rule
TerminologyTranslate บาท as THB, Keep product names such as iApp Portal in English
Tone and registerUse a formal, polite tone suitable for a business email, Use a casual, friendly tone
LengthUse exactly one sentence, Keep it short enough for a subtitle
FormatReturn only the translation, no quotes, Keep the numbering of the list
LanguageAvoid English contractions, Write numbers as digits

Rules work best when they are specific and can be checked in the output. For example, with the rule Keep product names such as iApp Portal, API Keys and Document OCR in English, the sentence "press Create Key to start using Document OCR" keeps "Create Key" in English; without it, the button name is translated. For a long glossary, send the terms that actually occur in the text rather than the whole list.

Accuracy​

ChindaMT was evaluated in the accompanying paper against other open translation models of the same size, in both directions (200 English-to-Thai and 200 Thai-to-English items per test), with and without rules. The figure is the share of comparisons in which a judge model preferred the ChindaMT-4B translation, corrected for answer length (50% is a tie).

ChindaMT-4B compared withPlain translationWith rules
Typhoon-Translate-1.5-4B61.8%68.4%
TranslateGemma-4B87.2%
MiLMMT-46-4B89.5%

In a blind test, three native Thai speakers preferred ChindaMT-4B over Typhoon-Translate-1.5-4B in 64% of plain translations and 69% of translations with rules (67% overall, 100 items each). Quality without rules does not drop: 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. Full tables, methods and the evaluation suites are in the paper.

Known limits:

  • The model covers Thai and English only.
  • It follows rules that a good reference translation could satisfy. Strict placeholder tokens and a large mandatory glossary are outside what it was trained for; check such output before use.
  • Like any machine translation, it can produce fluent but incorrect text. Review translations for legal, medical and other high-stakes use. The warnings field marks parts that are likely wrong.

Performance​

Measured through the API gateway on 29 September 2026, one request at a time, median of 3 to 9 runs, including network time from Bangkok:

RequestCharactersRound trip
One sentence, Thai to English820.36 s
Two sentences, English to Thai1830.38 s
The same, with two rules1830.40 s
One paragraph, English to Thai6530.60 s
About one page, English to Thai2,0280.71 s
About one page, Thai to English2,0440.61 s
About five pages, English to Thai10,0711.72 s
LimitValue
Text per request100,000 characters (text, or all texts together)
Rules per request2,000 characters in total
Time per request90 seconds, then 504
Rate limits (per API key)5 per second, 120 per minute, 3,000 per hour

Time grows much 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 requests.

Open Model​

The model family, its training data and evaluation suites are released for anyone to run or build on:

ReleaseLink
ChindaMT-4B, 2B and 0.8B weights (Apache 2.0)huggingface.co/iapp/ChindaMT-4B, 2B, 0.8B
Training data, 1.97 million recordshuggingface.co/datasets/iapp/ChindaMT-Grounded
Evaluation suitesChindaMT-CoreEval, ChindaMT-BroadEval
Data curation codegithub.com/iapp-technology/ChindaMT-RGDC
Paperarxiv.org/abs/2609.34770

The hosted API is the quickest way to use ChindaMT-4B without running a GPU. For on-premise deployment with your own terminology, contact sale@iapp.co.th.

Data Security and Compliance​

  • The service is GDPR and PDPA compliant.
  • Text is translated on iApp-operated servers in Thailand and is not sent to any third-party provider.
  • The text you send is not stored. Service logs record the language direction and the character count, not the content.

Technical Reference​

Authentication​

Base URL: https://api.iapp.co.th/v3/store/text/mt. Send your API key in the apikey header of every request.

POST /translate​

Translates one text.

FieldTypeRequiredDescription
textstringYesThe text to translate, at most 100,000 characters. It may span several lines.
source_lang"th" or "en"YesThe language of text.
target_lang"th" or "en"YesThe language to translate into. Must differ from source_lang.
rulesarray of stringsNoInstructions for the model, such as a term to use, a tone or an output format. For example ["Use a formal tone", "Translate บาท as THB"]. At most 2,000 characters in total.
{
"text": "The weather is nice today.\nSee you tomorrow.",
"source_lang": "en",
"target_lang": "th"
}

Response:

{
"translation": "วันนี้สภาพอากาศดีครับ\nพบกันพรุ่งนี้ครับ",
"source_lang": "en",
"target_lang": "th",
"warnings": []
}
FieldDescription
translationThe translated text.
source_lang, target_langThe direction used.
warningsParts of the translation that may be wrong. See Warnings.

POST /translate/batch​

Translates several separate texts in one request, such as UI strings or table cells. Every text is translated in the same direction and with the same rules.

FieldTypeRequiredDescription
textsarray of stringsYesAt least one text, at most 100,000 characters in total. Each text may span several lines.
source_lang, target_lang, rulesAs for /translate, applied to every text.
{
"texts": ["The weather is nice today.", "See you\ntomorrow."],
"source_lang": "en",
"target_lang": "th"
}

Response:

{
"translations": [
{"translation": "วันนี้สภาพอากาศดีครับ", "warnings": []},
{"translation": "พบกันใหม่\nพรุ่งนี้", "warnings": []}
],
"source_lang": "en",
"target_lang": "th"
}

translations has one entry per text, in the same order as texts, and each entry carries the warnings for its own text. A batch succeeds or fails as a whole: if it fails, no translations are returned and nothing is charged, so send the whole batch again.

How the text is handled​

  • Lines: each line is translated separately. Line breaks, and the spaces at the start and end of each line, are kept.
  • Lines left as they are: a line with no letters of the source language comes back unchanged, for example a blank line, a line of numbers, or a line already in the target language. Such lines are still counted for billing.

Warnings​

A warning marks a part of your text whose translation may be wrong. The request still succeeds, and translation contains the best result for that part.

{"reason": "truncated", "source": "…", "translation": "…"}
reasonMeaning
truncatedThe translation was cut off before it finished.
too_shortThe translation is much shorter than its source, so part of it may be missing.
wrong_languageThe translation is not in the target language.

source is the part of your text, and translation is what was returned for it.

Response headers​

HeaderDescription
iapp-input-charsCharacters charged for this request (on 200 only).
X-Request-IDIdentifier of the request. Include it when you report a problem.

Errors​

StatusCauseWhat to do
401Missing or invalid apikey.Check the key on the API Keys page of the portal.
402Your balance does not cover the characters in this request.Top up, or send less text per request.
413text is longer than 100,000 characters, or texts add up to more.Split the text over several requests.
422The body is invalid: a language other than th or en, the same language on both sides, rules longer than 2,000 characters, an empty texts, or a missing field.Fix the request.
429Rate limit exceeded for this API key.Wait and retry.
503The translation model is unavailable.Retry later.
504The translation did not finish within 90 seconds.Retry later, or send less text per request.

For 413, 503 and 504, detail is a message:

{"detail": "text must be at most 100,000 characters"}

For 422, detail is a list of problems with the body:

{
"detail": [
{
"type": "literal_error",
"loc": ["body", "target_lang"],
"msg": "Input should be 'th' or 'en'",
"input": "jp",
"ctx": {"expected": "'th' or 'en'"}
}
]
}

Errors are not charged.

Code Examples​

# One text, with rules
curl -X POST https://api.iapp.co.th/v3/store/text/mt/translate \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "ผู้ซื้อต้องชำระเงินจำนวน 5,000 บาท ภายใน 7 วัน", "source_lang": "th", "target_lang": "en", "rules": ["Translate บาท as THB", "Use a formal tone"]}'

# Several texts in one request
curl -X POST https://api.iapp.co.th/v3/store/text/mt/translate/batch \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"texts": ["Save changes", "Delete account", "Are you sure?"], "source_lang": "en", "target_lang": "th", "rules": ["Use short, polite UI wording"]}'

Changelog​

VersionDateChange
v0.2.0-2026092929 Sep 2026First public release: Thai-English translation in both directions with rules, /translate and /translate/batch, warnings, up to 100,000 characters per request. 1 IC per 400 characters.