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.

POST /v1/translate
Source en

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
Response th

พรีวิว อาร์เซนอล vs เชลซี อาร์เซนอลเก็บคลีนชีตได้ 4 นัดจาก 6 นัดหลังสุดในพรีเมียร์ลีก ขณะที่เชลซีมีค่า xG เฉลี่ย 1.8 เมื่อเล่นนอกบ้าน เริ่มเตะ 20:00 น. ที่เอมิเรตส์ สเตเดียม

9 terms enforced4 numbers restored0 warnings

Hover a term to see how the rule carried it across.

A night stadium where fans hold up lime, white, green, orange and blue cards to form one picture

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.

  1. 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 นอกบ้าน

  2. 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.

  3. 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.

  1. You send

    Chelsea average 1.8 xG and have won 3 of their last 5.

  2. The model sees

    ⟦E1⟧ average ⟦N1⟧ ⟦B1⟧ and have won ⟦N2⟧ of their last ⟦N3⟧.

  3. 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" }]
  }'
200 OK
{
  "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.

Sample data
ตารางคะแนนพรีเมียร์ลีก
Positionทีมแข่งชนะเสมอแพ้ได้เสียแต้ม
1อาร์เซนอล12921+1729
2แมนเชสเตอร์ ซิตี้12831+1527
3ลิเวอร์พูล12813+1125
4เชลซี12732+924
5แอสตัน วิลล่า12633+521
6นิวคาสเซิล ยูไนเต็ด12624+420

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
Get API key

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.