Sports translation that never fumbles a name.
Translate match previews, stats and odds copy into 12 languages. You set the glossary rules. We keep every number exact.
Arsenal vs Chelsea preview. Arsenal have kept 4 clean sheets in their last 6 Premier League games, while Chelsea average 1.8 xG away from home. Kick-off 20:00 at Emirates Stadium.
- keepxG
- mapclean sheets, Arsenal, Premier Leagueyour glossary
- mapChelsea, Emirates Stadiumsports termbase
- translateKick-off
พรีวิว อาร์เซนอล vs เชลซี อาร์เซนอลเก็บคลีนชีตได้ 4 นัดจาก 6 นัดหลังสุดในพรีเมียร์ลีก ขณะที่เชลซีมีค่า xG เฉลี่ย 1.8 เมื่อเล่นนอกบ้าน เริ่มเตะ 20:00 น. ที่เอมิเรตส์ สเตเดียม
Nhận định Arsenal vs Chelsea. Arsenal đã có 4 trận giữ sạch lưới trong 6 trận gần nhất tại Ngoại hạng Anh, trong khi Chelsea đạt trung bình 1,8 xG khi đá sân khách. Giờ bóng lăn 20:00 trên sân Emirates.
Prediksi Arsenal vs Chelsea. Arsenal mencatat 4 kali nirbobol dalam 6 laga terakhir Liga Primer Inggris, sementara Chelsea rata-rata mencatat 1,8 xG saat bermain tandang. Sepak mula pukul 20.00 di Stadion Emirates.
阿森纳 vs 切尔西 赛前前瞻。阿森纳在最近 6 场英超比赛中 4 次零封对手,而切尔西客场场均 xG 为 1.8。比赛将于 20:00 在酋长球场开球。
Previa del Arsenal vs Chelsea. El Arsenal ha dejado la portería a cero en 4 de sus últimos 6 partidos de la Premier League, mientras que el Chelsea promedia 1,8 xG como visitante. Saque inicial a las 20:00 en el Emirates Stadium.
Hover a term to see how the rule carried it across.

Thousands of fans, one card each, and the whole stand still reads as a single picture.
Nexosport works the same way with words. Every name, stat and number is placed on purpose, so the page reads right in every language you publish.
Glossary rules
Three rules. Every term does what you tell it.
Send rules with a request or save them in a glossary. They sit on top of our built-in sports termbase, and your rules always win.
- keep
Keep it as written
Brand names, stat codes like xG and BTTS, sponsor names. Masked before the model runs, so they cannot be translated by accident.
{ "term": "xG", "kind": "keep" }Chelsea average 1.8 xG away.
เชลซีมีค่า xG เฉลี่ย 1.8 นอกบ้าน
- map
Say it your way
House style for clubs, players and jargon. Your term goes in word for word, in every sentence, in every article.
{ "term": "clean sheet", "kind": "map", "to": { "th": "คลีนชีต", "es": "portería a cero" } }Their third clean sheet in a row.
Su tercera portería a cero seguida.
- translate
Never leave it in English
For words that tend to slip through untranslated. If one comes back in the source language, we retry once and flag it in warnings.
{ "term": "kick-off", "kind": "translate" }Kick-off is at 20:00.
Giờ bóng lăn lúc 20:00.
Scores, odds and xG come back exactly as sent.
The model never sees a digit. We swap every number and locked term for a placeholder, translate the words around them, then put the originals back and format them for the reader's locale.
You send
Chelsea average 1.8 xG and have won 3 of their last 5.
The model sees
⟦E1⟧ average ⟦N1⟧ ⟦B1⟧ and have won ⟦N2⟧ of their last ⟦N3⟧.
You get back es
El Chelsea promedia 1,8 xG y ha ganado 3 de sus últimos 5.
Before a response leaves, it has to pass:
- Numbers identical
- Locked terms present
- No English left behind
- Table rows and columns
- Heading order
- No leftover placeholders
- Script purity
- One decimal style
- Odds lines stay ASCII
- Native digits
- Date slots in CJK
One request. Every language you publish in.
Plain JSON over HTTPS. Send text or Markdown, list your target languages, and get every translation back in one response with a record of what each rule did.
curl https://api.nexosport.app/v1/translate \
-H "Authorization: Bearer $NEXOSPORT_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Arsenal have kept 4 clean sheets in their last 6 games.",
"source": "en",
"target": ["th", "vi"],
"glossary_id": "gls_8Kq2",
"rules": [{ "term": "xG", "kind": "keep" }]
}'const res = await fetch('https://api.nexosport.app/v1/translate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.NEXOSPORT_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
text: 'Arsenal have kept 4 clean sheets in their last 6 games.',
source: 'en',
target: ['th', 'vi'],
glossary_id: 'gls_8Kq2',
}),
})
const { translations } = await res.json()import os, requests
res = requests.post(
"https://api.nexosport.app/v1/translate",
headers={"Authorization": f"Bearer {os.environ['NEXOSPORT_KEY']}"},
json={
"text": "Arsenal have kept 4 clean sheets in their last 6 games.",
"source": "en",
"target": ["th", "vi"],
"glossary_id": "gls_8Kq2",
},
)
print(res.json()["translations"]["th"]){
"translations": {
"th": "อาร์เซนอลเก็บคลีนชีตได้ 4 นัดจาก 6 นัดหลังสุด",
"vi": "Arsenal đã có 4 trận giữ sạch lưới trong 6 trận gần nhất."
},
"enforced": [
{ "term": "clean sheet", "kind": "map", "source": "rule", "count": 1,
"rendered": { "th": "คลีนชีต", "vi": "giữ sạch lưới" } },
{ "term": "Arsenal", "kind": "map", "source": "rule", "count": 1,
"rendered": { "th": "อาร์เซนอล", "vi": "Arsenal" } }
],
"warnings": [],
"usage": { "characters": 55, "targets": 2, "credits": 110 }
}Sports data
Drop a live table into any article.
Write one tag where the table should go. We fetch fixtures, results or standings, name every team in the target language, and build the table after translation. No model ever touches those numbers.
## Title race
Arsenal lead by two points after 12 games.
{{nexo:standings league=premier-league top=6}}
## Next up
{{nexo:fixtures league=premier-league next=5}}Or call it directly: GET /v1/sports/football/standings?league=premier-league&lang=th returns JSON, Markdown or HTML.
| Position | Team | P | W | D | L | GD | Pts |
|---|---|---|---|---|---|---|---|
| 1 | Arsenal | 12 | 9 | 2 | 1 | +17 | 29 |
| 2 | Manchester City | 12 | 8 | 3 | 1 | +15 | 27 |
| 3 | Liverpool | 12 | 8 | 1 | 3 | +11 | 25 |
| 4 | Chelsea | 12 | 7 | 3 | 2 | +9 | 24 |
| 5 | Aston Villa | 12 | 6 | 3 | 3 | +5 | 21 |
| 6 | Newcastle United | 12 | 6 | 2 | 4 | +4 | 20 |
| Position | ทีม | แข่ง | ชนะ | เสมอ | แพ้ | ได้เสีย | แต้ม |
|---|---|---|---|---|---|---|---|
| 1 | อาร์เซนอล | 12 | 9 | 2 | 1 | +17 | 29 |
| 2 | แมนเชสเตอร์ ซิตี้ | 12 | 8 | 3 | 1 | +15 | 27 |
| 3 | ลิเวอร์พูล | 12 | 8 | 1 | 3 | +11 | 25 |
| 4 | เชลซี | 12 | 7 | 3 | 2 | +9 | 24 |
| 5 | แอสตัน วิลล่า | 12 | 6 | 3 | 3 | +5 | 21 |
| 6 | นิวคาสเซิล ยูไนเต็ด | 12 | 6 | 2 | 4 | +4 | 20 |
| Position | 球队 | 赛 | 胜 | 平 | 负 | 净胜球 | 积分 |
|---|---|---|---|---|---|---|---|
| 1 | 阿森纳 | 12 | 9 | 2 | 1 | +17 | 29 |
| 2 | 曼城 | 12 | 8 | 3 | 1 | +15 | 27 |
| 3 | 利物浦 | 12 | 8 | 1 | 3 | +11 | 25 |
| 4 | 切尔西 | 12 | 7 | 3 | 2 | +9 | 24 |
| 5 | 阿斯顿维拉 | 12 | 6 | 3 | 3 | +5 | 21 |
| 6 | 纽卡斯尔联 | 12 | 6 | 2 | 4 | +4 | 20 |
Team names change with the language. The numbers never do.
Twelve languages out of English.
Club, player and competition names come from a sports termbase built on football coverage translated by people. Your own rules work in every language, including beta directions that start from something other than English.
- ไทยThai
- 简体中文Chinese (Simplified)
- EspañolSpanish
- FrançaisFrench
- ខ្មែរKhmer
- ລາວLao
- မြန်မာBurmese
- FilipinoFilipino
- PortuguêsPortuguese
- РусскийRussian
- Tiếng ViệtVietnamese
- Bahasa IndonesiaIndonesian
Prepaid credits. No subscription.
One credit is one character translated into one language. A live table costs 500 credits. Credits last 12 months from purchase.
Free to start
$0
25,000 credits
Enough to wire up the API and translate a few previews. No card needed.
Starter
$19
1M credits
$19.00 per million characters
A season of match previews for one site.
Growth
$79
5M credits
$15.80 per million characters
Daily coverage across several leagues and languages.
Scale
$299
25M credits
$11.96 per million characters
Newsrooms and networks publishing in every market.
- Glossaries and the sports termbase on every pack
- Every target language at the same rate
- Unused credits roll over until they expire
Questions teams ask before they switch.
What counts as a character?
Every character of the text you send, spaces and Markdown included, counted once for each target language. Translating a 1,000-character preview into three languages costs 3,000 credits.
What happens when a rule cannot be applied?
Keep and map rules are applied before the model runs, so they always hold. Translate rules are checked afterwards: if a term comes back in the source language we retry once, then return the result with a warning that names the term.
Can I combine my glossary with the built-in termbase?
Yes. Your rules override the termbase whenever they overlap, and you can turn the termbase off for a single request with "use_termbase": false.
Which sports have live tables?
Football first: fixtures, results and standings for the top European leagues and UEFA competitions, plus leagues in England, Asia and the Americas. More competitions and sports will follow the same tag format.
Is my text stored?
Only to serve you. Translated segments are cached in your own account for 30 days so repeated sentences cost nothing and come back identical. They are never shared with other accounts.
Do credits expire?
Yes, 12 months after purchase. Your oldest credits are always used first.
Your first 25,000 characters are on us.
That covers about 8 match previews in three languages each. Get a key and send your first request in a couple of minutes.