Home/Providers/Providers and Vendors ENУКРРУС API Reference (ReDoc) ↗

Providers and Vendors

The 26 providers, why the console's 106 rows collapsed into them, and how outbound codes were chosen.

curl "https://languages.service.custom.mt/v1/providers"
curl "https://languages.service.custom.mt/v1/providers/deepl_api"
curl "https://languages.service.custom.mt/v1/providers/deepl_api/languages?effective=true"

The catalog

Provider codes are the same ones provider_credentials uses. One identifier resolves a credential there and a language code here; a caller never has to translate between two naming schemes.

Vendor Providers
OpenAI openai_api
Anthropic anthropic_api
Google Cloud google_translate, gemini_api
Microsoft Azure microsoft_translator
Amazon Web Services amazon_translate
DeepL deepl_api
Translated modernmt_api, lara_api
LanguageWire languagewire_api
SYSTRAN systran_translate
Tencent tencent_transmart
Alibaba Cloud alibaba_translate
Baidu baidu_translate
Naver papago_translate
Supertext supertext_translate
XL8 xl8_translate
Tarjama tarjama_mt
Tahrirchi tilmoch_api, sayqalchi_api
Widn.AI widn_tower_anthill, widn_tower_sugarloaf, widn_tower_vesuvius
Internal custom_finetuned_mt
Yandex Cloud yandex_translate
Pangeanic pangea_mt

Warning

in_credentials_catalog: false yandex_translate and pangea_mt carry console mappings — Yandex alone has 102 — but have no entry in provider_credentials yet. They are kept here so existing traffic keeps resolving, and flagged in the API so a caller can see the mapping exists without a credential contract behind it.

Why 106 console rows became 26

The console's translation_provider table has one row per model: OpenAI GPT 4o-2024-11-20, OpenAI GPT 5-mini-2025-08-07, Gemini 2.5 Pro, and so on — plus *_in_sys / *_out_sys rows that are billing meters, not engines.

Model rows collapse into their vendor's API provider because language support is a property of the vendor endpoint, not of the checkpoint behind it. provider_credentials already treats the model as a model_id configuration field under one credential, and duplicating a 130-row language table per model would mean 17 tables to keep in step for OpenAI alone.

The billing meters are dropped: they carry region-code links copied from their parent model, and importing them would double-count every mapping.

Nothing breaks for callers — every collapsed service_name survives as a provider alias:

curl ".../v1/resolve?provider=OpenAiGPT4o_2024_11_20_Provider&language=zh-CN"
# → { "provider": "openai_api", "code": "zh-CN", … }

The console's AutoML providers fold in the same way: GoogleAutoMLProvider addresses google_translate, LaraAutoMLProvider addresses lara_api. Their codes go to the same vendor APIs.

How the outbound code was chosen

For 97 (provider, language) pairs the console offered several codes. The winner is picked by:

  1. the console's is_default flag on the region code,
  2. equals the language's own canonical code — when several spellings compete and one is what we already call the language, sending anything else is gratuitous divergence,
  3. BCP-47 canonicality (es-419 over ES-LA),
  4. the newest legacy provider that chose it — later model rows were curated more recently than the 2023-era ones,
  5. the lowest region-code id, matching the console's .first() for ties.

Unlike the language's canonical code, this never prefers a shorter tag on its own. If DeepL's API wants zh-Hans and only zh-Hans, the console row saying so is the fact — rule 2 only fires when several spellings genuinely compete.

Every runner-up becomes an inbound alias, so no spelling that resolves today stops resolving. All 97 decisions are listed in data/seed/REPORT.md.

Explicit versus effective

# only pairs someone configured
curl ".../v1/providers/deepl_api/languages"

# every language, fallbacks included — what the provider would actually receive
curl ".../v1/providers/deepl_api/languages?effective=true"

DeepL has 3 explicit rows and 348 effective ones. That is not a gap: base languages need no row, and regional ones fall back per Fallback Policies. The admin panel's coverage bars show the split per provider.

Next